diff options
author | jeff <none@none> | 2006-02-27 15:36:48 +0000 |
---|---|---|
committer | jeff <none@none> | 2006-02-27 15:36:48 +0000 |
commit | 84a43c5cf9698287ea303701a9e865b2ca4570e6 (patch) | |
tree | 94999b1d2d3ed1cea00babca392002697c3d2cca /lib/sqlalchemy/ext/activemapper.py | |
parent | d368fd17d916b5a34490e27099cf39c127622270 (diff) | |
download | sqlalchemy-84a43c5cf9698287ea303701a9e865b2ca4570e6.tar.gz |
Added code to make foreignkey on ActiveMapper accept a string and create the ForeignKey object on the fly. Also added ability to pass args and kwargs to Column constructor. ActiveMapper columns can have keyword args indexed and unique which will automatically create a index or a unique index. dburi in AutoConnectEngine can be a callable.
Diffstat (limited to 'lib/sqlalchemy/ext/activemapper.py')
-rw-r--r-- | lib/sqlalchemy/ext/activemapper.py | 34 |
1 files changed, 25 insertions, 9 deletions
diff --git a/lib/sqlalchemy/ext/activemapper.py b/lib/sqlalchemy/ext/activemapper.py index 8b3387eae..e5b3e4929 100644 --- a/lib/sqlalchemy/ext/activemapper.py +++ b/lib/sqlalchemy/ext/activemapper.py @@ -1,10 +1,10 @@ from sqlalchemy import objectstore, create_engine, assign_mapper, relation, mapper from sqlalchemy import and_, or_ -from sqlalchemy import Table, Column +from sqlalchemy import Table, Column, ForeignKey from sqlalchemy.ext.proxy import ProxyEngine import inspect - +import sys # # the "proxy" to the database engine... this can be swapped out at runtime @@ -17,13 +17,18 @@ engine = ProxyEngine() # declarative column declaration - this is so that we can infer the colname # class column(object): - def __init__(self, coltype, colname=None, foreign_key=None, primary_key=False): + def __init__(self, coltype, colname=None, foreign_key=None, + primary_key=False, *args, **kwargs): + if isinstance( foreign_key, basestring ): + foreign_key= ForeignKey( foreign_key ) self.coltype = coltype self.colname = colname self.foreign_key = foreign_key self.primary_key = primary_key - - + self.unique = kwargs.pop( 'unique', False ) + self.indexed = kwargs.pop( 'indexed', self.unique ) + self.kwargs = kwargs + self.args = args # # declarative relationship declaration @@ -89,6 +94,7 @@ class ActiveMapperMeta(type): table_name = clsname.lower() columns = [] relations = {} + _engine = getattr( sys.modules[cls.__module__], "__engine__", engine ) if 'mapping' in dict: members = inspect.getmembers(dict.get('mapping')) @@ -97,6 +103,10 @@ class ActiveMapperMeta(type): table_name = value continue + if '__engine__' == name: + _engine= value + continue + if name.startswith('__'): continue if isinstance(value, column): @@ -104,18 +114,24 @@ class ActiveMapperMeta(type): col = Column(value.colname or name, value.coltype, value.foreign_key, - primary_key=value.primary_key) + primary_key=value.primary_key, + *value.args, **value.kwargs) else: col = Column(value.colname or name, value.coltype, - primary_key=value.primary_key) + primary_key=value.primary_key, + *value.args, **value.kwargs) columns.append(col) + if value.indexed: + # create a Index object for the column + index= Index( "%s_idx" % (value.colname or name), + col, unique= value.unique ) continue if isinstance(value, relationship): relations[name] = value - - cls.table = Table(table_name, engine, *columns) + assert _engine is not None, "No engine specified" + cls.table = Table(table_name, _engine, *columns) assign_mapper(cls, cls.table) cls.relations = relations ActiveMapperMeta.classes[clsname] = cls |