From dbd6d12499f0a25fe7b3d9bb9b0d441df14318ea Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Thu, 31 Dec 2015 21:38:53 -0600 Subject: [PATCH] web: Add data model using SQLAlchemy --- .gitignore | 1 + setup.py | 1 + src/rouse/web/__main__.py | 37 +++++++++++++++++++++++++++++++++++++ src/rouse/web/model.py | 35 +++++++++++++++++++++++++++++++++++ 4 files changed, 74 insertions(+) create mode 100644 src/rouse/web/__main__.py create mode 100644 src/rouse/web/model.py diff --git a/.gitignore b/.gitignore index 18089fb..824677e 100644 --- a/.gitignore +++ b/.gitignore @@ -3,3 +3,4 @@ __pycache__/ *.py[co] *.ini +*.sqlite diff --git a/setup.py b/setup.py index 1448191..d50ba48 100644 --- a/setup.py +++ b/setup.py @@ -12,5 +12,6 @@ setup( package_dir={'': 'src'}, install_requires=[ 'Milla>=0.3', + 'SQLAlchemy', ], ) diff --git a/src/rouse/web/__main__.py b/src/rouse/web/__main__.py new file mode 100644 index 0000000..ac40018 --- /dev/null +++ b/src/rouse/web/__main__.py @@ -0,0 +1,37 @@ +from . import model +import argparse +import milla.util +import sqlalchemy + + +def createdb(args): + config = milla.util.read_config(args.config) + engine = sqlalchemy.engine_from_config(config, 'sqlalchemy.') + engine.echo = not args.quiet + session = model.Session(bind=engine) + model.Base.metadata.create_all(session.bind) + session.commit() + session.close() + session.bind.dispose() + + +def parse_args(): + parser = argparse.ArgumentParser(prog=__package__) + sp = parser.add_subparsers(metavar='command') + sp.required = True + p_createdb = sp.add_parser('createdb', + help='Create initial database schema') + p_createdb.add_argument('--quiet', '-q', action='store_true', + default=False, + help='Do not print issued SQL') + p_createdb.add_argument('config', help='Path to configuration file') + p_createdb.set_defaults(func=createdb) + return parser.parse_args() + + +def main(): + args = parse_args() + args.func(args) + + +main() diff --git a/src/rouse/web/model.py b/src/rouse/web/model.py new file mode 100644 index 0000000..df61d75 --- /dev/null +++ b/src/rouse/web/model.py @@ -0,0 +1,35 @@ +from __future__ import unicode_literals +from sqlalchemy import schema, types, orm +from sqlalchemy.ext import declarative + + +Base = declarative.declarative_base() + +Session = orm.session.sessionmaker() + + +# pylint: disable=too-few-public-methods + +class Serializable(object): + + def to_json(self): + data = {} + for attr in self.__table__.columns.keys(): + if attr.startswith('_'): + continue + value = getattr(self, attr) + if attr.endswith('_'): + data[attr[:-1]] = value + else: + data[attr] = value + return data + + +class Host(Base, Serializable): + + __tablename__ = 'hosts' + + id = schema.Column(types.Integer, autoincrement=True, primary_key=True) + macaddr = schema.Column(types.String(18), nullable=False) + ipaddr = schema.Column(types.String(46)) + hostname = schema.Column(types.Unicode(253))