[Sqlalchemy-commits] [1062] sqlalchemy/trunk/test: Added code to make foreignkey on ActiveMapper acc
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-02-27 15:37:06
|
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head><style type="text/css"><!-- #msg dl { border: 1px #006 solid; background: #369; padding: 6px; color: #fff; } #msg dt { float: left; width: 6em; font-weight: bold; } #msg dt:after { content:':';} #msg dl, #msg dt, #msg ul, #msg li { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; } #msg dl a { font-weight: bold} #msg dl a:link { color:#fc3; } #msg dl a:active { color:#ff0; } #msg dl a:visited { color:#cc6; } h3 { font-family: verdana,arial,helvetica,sans-serif; font-size: 10pt; font-weight: bold; } #msg pre { overflow: auto; background: #ffc; border: 1px #fc0 solid; padding: 6px; } #msg ul, pre { overflow: auto; } #patch { width: 100%; } #patch h4 {font-family: verdana,arial,helvetica,sans-serif;font-size:10pt;padding:8px;background:#369;color:#fff;margin:0;} #patch .propset h4, #patch .binary h4 {margin:0;} #patch pre {padding:0;line-height:1.2em;margin:0;} #patch .diff {width:100%;background:#eee;padding: 0 0 10px 0;overflow:auto;} #patch .propset .diff, #patch .binary .diff {padding:10px 0;} #patch span {display:block;padding:0 10px;} #patch .modfile, #patch .addfile, #patch .delfile, #patch .propset, #patch .binary, #patch .copfile {border:1px solid #ccc;margin:10px 0;} #patch ins {background:#dfd;text-decoration:none;display:block;padding:0 10px;} #patch del {background:#fdd;text-decoration:none;display:block;padding:0 10px;} #patch .lines, .info {color:#888;background:#fff;} --></style> <title>[1062] sqlalchemy/trunk/test: Added code to make foreignkey on ActiveMapper accept a string and create the ForeignKey object on the fly.</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1062</dd> <dt>Author</dt> <dd>jeff</dd> <dt>Date</dt> <dd>2006-02-27 09:36:48 -0600 (Mon, 27 Feb 2006)</dd> </dl> <h3>Log Message</h3> <pre>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.</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemytrunklibsqlalchemyextactivemapperpy">sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py</a></li> <li><a href="#sqlalchemytrunklibsqlalchemyextproxypy">sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py</a></li> </ul> <h3>Added Paths</h3> <ul> <li><a href="#sqlalchemytrunktestautoconnect_enginepy">sqlalchemy/trunk/test/autoconnect_engine.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemytrunklibsqlalchemyextactivemapperpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py (1061 => 1062)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py 2006-02-27 06:49:09 UTC (rev 1061) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/activemapper.py 2006-02-27 15:36:48 UTC (rev 1062) </span><span class="lines">@@ -1,11 +1,11 @@ </span><span class="cx"> from sqlalchemy import objectstore, create_engine, assign_mapper, relation, mapper </span><span class="cx"> from sqlalchemy import and_, or_ </span><del>-from sqlalchemy import Table, Column </del><ins>+from sqlalchemy import Table, Column, ForeignKey </ins><span class="cx"> from sqlalchemy.ext.proxy import ProxyEngine </span><span class="cx"> </span><span class="cx"> import inspect </span><ins>+import sys </ins><span class="cx"> </span><del>- </del><span class="cx"> # </span><span class="cx"> # the "proxy" to the database engine... this can be swapped out at runtime </span><span class="cx"> # </span><span class="lines">@@ -17,14 +17,19 @@ </span><span class="cx"> # declarative column declaration - this is so that we can infer the colname </span><span class="cx"> # </span><span class="cx"> class column(object): </span><del>- def __init__(self, coltype, colname=None, foreign_key=None, primary_key=False): </del><ins>+ def __init__(self, coltype, colname=None, foreign_key=None, + primary_key=False, *args, **kwargs): + if isinstance( foreign_key, basestring ): + foreign_key= ForeignKey( foreign_key ) </ins><span class="cx"> self.coltype = coltype </span><span class="cx"> self.colname = colname </span><span class="cx"> self.foreign_key = foreign_key </span><span class="cx"> self.primary_key = primary_key </span><ins>+ self.unique = kwargs.pop( 'unique', False ) + self.indexed = kwargs.pop( 'indexed', self.unique ) + self.kwargs = kwargs + self.args = args </ins><span class="cx"> </span><del>- - </del><span class="cx"> # </span><span class="cx"> # declarative relationship declaration </span><span class="cx"> # </span><span class="lines">@@ -89,6 +94,7 @@ </span><span class="cx"> table_name = clsname.lower() </span><span class="cx"> columns = [] </span><span class="cx"> relations = {} </span><ins>+ _engine = getattr( sys.modules[cls.__module__], "__engine__", engine ) </ins><span class="cx"> </span><span class="cx"> if 'mapping' in dict: </span><span class="cx"> members = inspect.getmembers(dict.get('mapping')) </span><span class="lines">@@ -97,6 +103,10 @@ </span><span class="cx"> table_name = value </span><span class="cx"> continue </span><span class="cx"> </span><ins>+ if '__engine__' == name: + _engine= value + continue + </ins><span class="cx"> if name.startswith('__'): continue </span><span class="cx"> </span><span class="cx"> if isinstance(value, column): </span><span class="lines">@@ -104,18 +114,24 @@ </span><span class="cx"> col = Column(value.colname or name, </span><span class="cx"> value.coltype, </span><span class="cx"> value.foreign_key, </span><del>- primary_key=value.primary_key) </del><ins>+ primary_key=value.primary_key, + *value.args, **value.kwargs) </ins><span class="cx"> else: </span><span class="cx"> col = Column(value.colname or name, </span><span class="cx"> value.coltype, </span><del>- primary_key=value.primary_key) </del><ins>+ primary_key=value.primary_key, + *value.args, **value.kwargs) </ins><span class="cx"> columns.append(col) </span><ins>+ if value.indexed: + # create a Index object for the column + index= Index( "%s_idx" % (value.colname or name), + col, unique= value.unique ) </ins><span class="cx"> continue </span><span class="cx"> </span><span class="cx"> if isinstance(value, relationship): </span><span class="cx"> relations[name] = value </span><del>- - cls.table = Table(table_name, engine, *columns) </del><ins>+ assert _engine is not None, "No engine specified" + cls.table = Table(table_name, _engine, *columns) </ins><span class="cx"> assign_mapper(cls, cls.table) </span><span class="cx"> cls.relations = relations </span><span class="cx"> ActiveMapperMeta.classes[clsname] = cls </span></span></pre></div> <a id="sqlalchemytrunklibsqlalchemyextproxypy"></a> <div class="modfile"><h4>Modified: sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py (1061 => 1062)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-02-27 06:49:09 UTC (rev 1061) +++ sqlalchemy/trunk/lib/sqlalchemy/ext/proxy.py 2006-02-27 15:36:48 UTC (rev 1062) </span><span class="lines">@@ -65,7 +65,11 @@ </span><span class="cx"> </span><span class="cx"> def get_engine(self): </span><span class="cx"> if self._engine is None: </span><del>- self._engine= create_engine( self.dburi, self.opts, **self.kwargs ) </del><ins>+ if callable(self.dburi): + dburi= self.dburi() + else: + dburi= self.dburi + self._engine= create_engine( dburi, self.opts, **self.kwargs ) </ins><span class="cx"> return self._engine </span><span class="cx"> </span><span class="cx"> def set_engine(self, engine): </span></span></pre></div> <a id="sqlalchemytrunktestautoconnect_enginepy"></a> <div class="addfile"><h4>Added: sqlalchemy/trunk/test/autoconnect_engine.py (1061 => 1062)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/trunk/test/autoconnect_engine.py 2006-02-27 06:49:09 UTC (rev 1061) +++ sqlalchemy/trunk/test/autoconnect_engine.py 2006-02-27 15:36:48 UTC (rev 1062) </span><span class="lines">@@ -0,0 +1,90 @@ </span><ins>+from sqlalchemy import * +from sqlalchemy.ext.proxy import AutoConnectEngine + +from testbase import PersistTest +import testbase +import os + +# +# Define an engine, table and mapper at the module level, to show that the +# table and mapper can be used with different real engines in multiple threads +# + + +module_engine = AutoConnectEngine( testbase.db_uri ) +users = Table('users', module_engine, + Column('user_id', Integer, primary_key=True), + Column('user_name', String(16)), + Column('password', String(20)) + ) + +class User(object): + pass + + +class AutoConnectEngineTest1(PersistTest): + + def setUp(self): + clear_mappers() + objectstore.clear() + + def test_engine_connect(self): + users.create() + assign_mapper(User, users) + try: + trans = objectstore.begin() + + user = User() + user.user_name='fred' + user.password='*' + trans.commit() + + # select + sqluser = User.select_by(user_name='fred')[0] + assert sqluser.user_name == 'fred' + + # modify + sqluser.user_name = 'fred jones' + + # commit - saves everything that changed + objectstore.commit() + + allusers = [ user.user_name for user in User.select() ] + assert allusers == [ 'fred jones' ] + finally: + users.drop() + + + + +if __name__ == "__main__": + testbase.main() + + + + + + + + + + + + + + + + + + + + + + + + + + + + + </ins></span></pre> </div> </div> </body> </html> |