[Sqlalchemy-commits] [1456] sqlalchemy/branches/schema/lib/sqlalchemy: small fix for _find_dependent
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-15 20:37:26
|
<!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>[1456] sqlalchemy/branches/schema/lib/sqlalchemy: small fix for _find_dependent fixing [ticket:183]</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1456</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-15 15:37:09 -0500 (Mon, 15 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>small fix for _find_dependent fixing [ticket:183] MetaData returns None for no engine present, raising an exception moved to session/clauseelement.execute. doc tweak for oracle threaded keyword, foreignkey keyword fix to Alias which was calling "name" on Select/CompoundSelect</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemadocbuildcontentadv_datamappingtxt">sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt</a></li> <li><a href="#sqlalchemybranchesschemadocbuildcontentdbenginetxt">sqlalchemy/branches/schema/doc/build/content/dbengine.txt</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormpropertiespy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyormsessionpy">sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyschemapy">sqlalchemy/branches/schema/lib/sqlalchemy/schema.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/sql.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemadocbuildcontentadv_datamappingtxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/doc/build/content/adv_datamapping.txt 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -620,7 +620,7 @@ </span><span class="cx"> } </span><span class="cx"> ) </span><span class="cx"> </span><del>-The "root" property on a TreeNode is a many-to-one relationship. By default, a self-referential mapper declares relationships as one-to-many, so the extra parameter `foreignkey`, pointing to the "many" side of a relationship, is needed to indicate a "many-to-one" self-referring relationship. </del><ins>+The "root" property on a TreeNode is a many-to-one relationship. By default, a self-referential mapper declares relationships as one-to-many, so the extra parameter `foreignkey`, pointing to the remote side of a relationship, is needed to indicate a "many-to-one" self-referring relationship. </ins><span class="cx"> Both TreeNode examples above are available in functional form in the `examples/adjacencytree` directory of the distribution. </span><span class="cx"> </span><span class="cx"> ### Result-Set Mapping {@name=resultset} </span></span></pre></div> <a id="sqlalchemybranchesschemadocbuildcontentdbenginetxt"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/doc/build/content/dbengine.txt (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/doc/build/content/dbengine.txt 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/doc/build/content/dbengine.txt 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -69,6 +69,7 @@ </span><span class="cx"> * logger=None : a file-like object where logging output can be sent, if echo is set to True. Newlines will not be sent with log messages. This defaults to an internal logging object which references `sys.stdout`. </span><span class="cx"> * module=None : used by database implementations which support multiple DBAPI modules, this is a reference to a DBAPI2 module to be used instead of the engine's default module. For Postgres, the default is psycopg2, or psycopg1 if 2 cannot be found. For Oracle, its cx_Oracle. </span><span class="cx"> * use_ansi=True : used only by Oracle; when False, the Oracle driver attempts to support a particular "quirk" of Oracle versions 8 and previous, that the LEFT OUTER JOIN SQL syntax is not supported, and the "Oracle join" syntax of using `&lt;column1&gt;(+)=&lt;column2&gt;` must be used in order to achieve a LEFT OUTER JOIN. </span><ins>+* threaded=True : used by cx_Oracle; sets the `threaded` parameter of the connection indicating thread-safe usage. cx_Oracle docs indicate setting this flag to `False` will speed performance by 10-15%. While this defaults to `False` in cx_Oracle, SQLAlchemy defaults it to `True`, preferring stability over early optimization. </ins><span class="cx"> * use_oids=False : used only by Postgres, will enable the column name "oid" as the object ID column, which is also used for the default sort order of tables. Postgres as of 8.1 has object IDs disabled by default. </span><span class="cx"> * convert_unicode=False : if set to True, all String/character based types will convert Unicode values to raw byte values going into the database, and all raw byte values to Python Unicode coming out in result sets. This is an engine-wide method to provide unicode across the board. For unicode conversion on a column-by-column level, use the `Unicode` column type instead. </span><span class="cx"> * encoding='utf-8' : the encoding to use for all Unicode translations, both by engine-wide unicode conversion as well as the `Unicode` type object. </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormpropertiespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/properties.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -275,22 +275,22 @@ </span><span class="cx"> # set as a reference to allow assignment from inside a first-class function </span><span class="cx"> dependent = [None] </span><span class="cx"> def foo(binary): </span><del>- if binary.operator != '=': </del><ins>+ if binary.operator != '=' or not isinstance(binary.left, schema.Column) or not isinstance(binary.right, schema.Column): </ins><span class="cx"> return </span><del>- if isinstance(binary.left, schema.Column) and binary.left.primary_key: </del><ins>+ if binary.left.primary_key: </ins><span class="cx"> if dependent[0] is binary.left.table: </span><del>- raise exceptions.ArgumentError("bidirectional dependency not supported...specify foreignkey") </del><ins>+ raise exceptions.ArgumentError("Could not determine the parent/child relationship for property '%s', based on join condition '%s' (table '%s' appears on both sides of the relationship, or in an otherwise ambiguous manner). please specify the 'foreignkey' keyword parameter to the relation() function indicating a column on the remote side of the relationship" % (self.key, str(self.primaryjoin), str(binary.left.table))) </ins><span class="cx"> dependent[0] = binary.right.table </span><span class="cx"> self.foreignkey= binary.right </span><del>- elif isinstance(binary.right, schema.Column) and binary.right.primary_key: </del><ins>+ elif binary.right.primary_key: </ins><span class="cx"> if dependent[0] is binary.right.table: </span><del>- raise exceptions.ArgumentError("bidirectional dependency not supported...specify foreignkey") </del><ins>+ raise exceptions.ArgumentError("Could not determine the parent/child relationship for property '%s', based on join condition '%s' (table '%s' appears on both sides of the relationship, or in an otherwise ambiguous manner). please specify the 'foreignkey' keyword parameter to the relation() function indicating a column on the remote side of the relationship" % (self.key, str(self.primaryjoin), str(binary.right.table))) </ins><span class="cx"> dependent[0] = binary.left.table </span><span class="cx"> self.foreignkey = binary.left </span><span class="cx"> visitor = BinaryVisitor(foo) </span><span class="cx"> self.primaryjoin.accept_visitor(visitor) </span><span class="cx"> if dependent[0] is None: </span><del>- raise exceptions.ArgumentError("cant determine primary foreign key in the join relationship....specify foreignkey=<column> or foreignkey=[<columns>]") </del><ins>+ raise exceptions.ArgumentError("Could not determine the parent/child relationship for property '%s', based on join condition '%s' (no relationships joining tables '%s' and '%s' could be located). please specify the 'foreignkey' keyword parameter to the relation() function indicating a column on the remote side of the relationship" % (self.key, str(self.primaryjoin), str(binary.left.table), str(binary.right.table))) </ins><span class="cx"> else: </span><span class="cx"> self.foreigntable = dependent[0] </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyormsessionpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/orm/session.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -169,7 +169,10 @@ </span><span class="cx"> elif self.bind_to is not None: </span><span class="cx"> return self.bind_to </span><span class="cx"> else: </span><del>- return mapper.select_table.engine </del><ins>+ e = mapper.select_table.engine + if e is None: + raise exceptions.InvalidRequestError("Could not locate any Engine bound to mapper '%s'" % str(mapper)) + return e </ins><span class="cx"> def query(self, mapper_or_class, entity_name=None): </span><span class="cx"> """given a mapper or Class, returns a new Query object corresponding to this Session and the mapper, or the classes' primary mapper.""" </span><span class="cx"> if isinstance(mapper_or_class, type): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyschemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/schema.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/schema.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -654,7 +654,7 @@ </span><span class="cx"> return self </span><span class="cx"> def _get_engine(self): </span><span class="cx"> if not self.is_bound(): </span><del>- raise exceptions.InvalidRequestError("MetaData '%s' is not bound to any engine" % self.name) </del><ins>+ return None </ins><span class="cx"> return self._engine </span><span class="cx"> </span><span class="cx"> class BoundMetaData(MetaData): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1455 => 1456)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-15 16:45:38 UTC (rev 1455) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-05-15 20:37:09 UTC (rev 1456) </span><span class="lines">@@ -1049,12 +1049,13 @@ </span><span class="cx"> self.original = baseselectable </span><span class="cx"> self.selectable = selectable </span><span class="cx"> if alias is None: </span><del>- n = getattr(self.original, 'name', None) - if n is None: - n = 'anon' - elif len(n) > 15: - n = n[0:15] - alias = n + "_" + hex(random.randint(0, 65535))[2:] </del><ins>+ if self.original.named_with_column(): + alias = getattr(self.original, 'name', None) + if alias is None: + alias = 'anon' + elif len(alias) > 15: + alias = alias[0:15] + alias = alias + "_" + hex(random.randint(0, 65535))[2:] </ins><span class="cx"> self.name = alias </span><span class="cx"> </span><span class="cx"> def _locate_oid_column(self): </span><span class="lines">@@ -1263,7 +1264,10 @@ </span><span class="cx"> self.order_by(*kwargs.get('order_by', [None])) </span><span class="cx"> self._col_map = {} </span><span class="cx"> </span><del>- name = property(lambda s:s.keyword + " statement") </del><ins>+# name = property(lambda s:s.keyword + " statement") + def _foo(self): + raise "this is a temporary assertion while we refactor SQL to not call 'name' on non-table Selectables" + name = property(lambda s:s._foo()) #"SELECT statement") </ins><span class="cx"> </span><span class="cx"> def _locate_oid_column(self): </span><span class="cx"> return self.selects[0].oid_column </span><span class="lines">@@ -1353,7 +1357,7 @@ </span><span class="cx"> self.append_from(f) </span><span class="cx"> </span><span class="cx"> def _foo(self): </span><del>- raise "wtf?" </del><ins>+ raise "this is a temporary assertion while we refactor SQL to not call 'name' on non-table Selectables" </ins><span class="cx"> name = property(lambda s:s._foo()) #"SELECT statement") </span><span class="cx"> </span><span class="cx"> class CorrelatedVisitor(ClauseVisitor): </span></span></pre> </div> </div> </body> </html> |