[Sqlalchemy-commits] [1288] sqlalchemy/branches/schema/lib/sqlalchemy: pg oids sorta working, auto-r
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-18 19:39:18
|
<!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>[1288] sqlalchemy/branches/schema/lib/sqlalchemy: pg oids sorta working, auto-rollback when exceptions raise so the show can go on...</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1288</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-18 14:39:03 -0500 (Tue, 18 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>pg oids sorta working, auto-rollback when exceptions raise so the show can go on...</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemyansisqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasesinformation_schemapy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/information_schema.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasespostgrespy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyenginebasepy">sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.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="sqlalchemybranchesschemalibsqlalchemyansisqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py (1287 => 1288)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py 2006-04-18 19:06:04 UTC (rev 1287) +++ sqlalchemy/branches/schema/lib/sqlalchemy/ansisql.py 2006-04-18 19:39:03 UTC (rev 1288) </span><span class="lines">@@ -173,7 +173,7 @@ </span><span class="cx"> if column.table is None or column.table.name is None: </span><span class="cx"> self.strings[column] = column.name </span><span class="cx"> else: </span><del>- if False and column.table.oid_column is column: </del><ins>+ if column.table.oid_column is column: </ins><span class="cx"> n = self.dialect.oid_column_name() </span><span class="cx"> if n is not None: </span><span class="cx"> self.strings[column] = "%s.%s" % (column.table.name, n) </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemydatabasesinformation_schemapy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/information_schema.py (1287 => 1288)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/information_schema.py 2006-04-18 19:06:04 UTC (rev 1287) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/information_schema.py 2006-04-18 19:39:03 UTC (rev 1288) </span><span class="lines">@@ -7,22 +7,22 @@ </span><span class="cx"> from sqlalchemy import * </span><span class="cx"> from sqlalchemy.ansisql import * </span><span class="cx"> </span><del>-generic_engine = ansisql.create_engine() </del><ins>+ischema = MetaData() </ins><span class="cx"> </span><del>-gen_schemata = schema.Table("schemata", generic_engine, </del><ins>+schemata = schema.Table("schemata", ischema, </ins><span class="cx"> Column("catalog_name", String), </span><span class="cx"> Column("schema_name", String), </span><span class="cx"> Column("schema_owner", String), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><del>-gen_tables = schema.Table("tables", generic_engine, </del><ins>+tables = schema.Table("tables", ischema, </ins><span class="cx"> Column("table_catalog", String), </span><span class="cx"> Column("table_schema", String), </span><span class="cx"> Column("table_name", String), </span><span class="cx"> Column("table_type", String), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><del>-gen_columns = schema.Table("columns", generic_engine, </del><ins>+columns = schema.Table("columns", ischema, </ins><span class="cx"> Column("table_schema", String), </span><span class="cx"> Column("table_name", String), </span><span class="cx"> Column("column_name", String), </span><span class="lines">@@ -33,30 +33,42 @@ </span><span class="cx"> Column("numeric_precision", Integer), </span><span class="cx"> Column("numeric_scale", Integer), </span><span class="cx"> Column("column_default", Integer), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><del>-gen_constraints = schema.Table("table_constraints", generic_engine, </del><ins>+constraints = schema.Table("table_constraints", ischema, </ins><span class="cx"> Column("table_schema", String), </span><span class="cx"> Column("table_name", String), </span><span class="cx"> Column("constraint_name", String), </span><span class="cx"> Column("constraint_type", String), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><del>-gen_column_constraints = schema.Table("constraint_column_usage", generic_engine, </del><ins>+column_constraints = schema.Table("constraint_column_usage", ischema, </ins><span class="cx"> Column("table_schema", String), </span><span class="cx"> Column("table_name", String), </span><span class="cx"> Column("column_name", String), </span><span class="cx"> Column("constraint_name", String), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><del>-gen_key_constraints = schema.Table("key_column_usage", generic_engine, </del><ins>+pg_key_constraints = schema.Table("key_column_usage", ischema, </ins><span class="cx"> Column("table_schema", String), </span><span class="cx"> Column("table_name", String), </span><span class="cx"> Column("column_name", String), </span><span class="cx"> Column("constraint_name", String), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><del>-gen_ref_constraints = schema.Table("referential_constraints", generic_engine, </del><ins>+mysql_key_constraints = schema.Table("key_column_usage", ischema, + Column("table_schema", String), + Column("table_name", String), + Column("column_name", String), + Column("constraint_name", String), + Column("referenced_table_schema", String), + Column("referenced_table_name", String), + Column("referenced_column_name", String), + schema="information_schema") + +key_constraints = pg_key_constraints + +ref_constraints = schema.Table("referential_constraints", ischema, </ins><span class="cx"> Column("constraint_catalog", String), </span><span class="cx"> Column("constraint_schema", String), </span><span class="cx"> Column("constraint_name", String), </span><span class="lines">@@ -66,7 +78,7 @@ </span><span class="cx"> Column("match_option", String), </span><span class="cx"> Column("update_rule", String), </span><span class="cx"> Column("delete_rule", String), </span><del>- dbschema="information_schema") </del><ins>+ schema="information_schema") </ins><span class="cx"> </span><span class="cx"> class ISchema(object): </span><span class="cx"> def __init__(self, engine): </span><span class="lines">@@ -88,37 +100,25 @@ </span><span class="cx"> return self.cache[name] </span><span class="cx"> </span><span class="cx"> </span><del>-def reflecttable(engine, table, ischema_names, use_mysql=False): - columns = gen_columns.toengine(engine) - constraints = gen_constraints.toengine(engine) </del><ins>+def reflecttable(connection, table, ischema_names, use_mysql=False): </ins><span class="cx"> </span><span class="cx"> if use_mysql: </span><span class="cx"> # no idea which INFORMATION_SCHEMA spec is correct, mysql or postgres </span><del>- key_constraints = schema.Table("key_column_usage", engine, - Column("table_schema", String), - Column("table_name", String), - Column("column_name", String), - Column("constraint_name", String), - Column("referenced_table_schema", String), - Column("referenced_table_name", String), - Column("referenced_column_name", String), - schema="information_schema", useexisting=True) </del><ins>+ key_constraints = mysql_key_constraints </ins><span class="cx"> else: </span><del>- column_constraints = gen_column_constraints.toengine(engine) - key_constraints = gen_key_constraints.toengine(engine) - - </del><ins>+ key_constraints = pg_key_constraints + </ins><span class="cx"> if table.schema is not None: </span><span class="cx"> current_schema = table.schema </span><span class="cx"> else: </span><del>- current_schema = engine.get_default_schema_name() </del><ins>+ current_schema = connection.default_schema_name() </ins><span class="cx"> </span><span class="cx"> s = select([columns], </span><span class="cx"> sql.and_(columns.c.table_name==table.name, </span><span class="cx"> columns.c.table_schema==current_schema), </span><span class="cx"> order_by=[columns.c.ordinal_position]) </span><span class="cx"> </span><del>- c = s.execute() </del><ins>+ c = connection.execute(s) </ins><span class="cx"> while True: </span><span class="cx"> row = c.fetchone() </span><span class="cx"> if row is None: </span><span class="lines">@@ -160,7 +160,7 @@ </span><span class="cx"> s.append_whereclause(constraints.c.table_name==table.name) </span><span class="cx"> s.append_whereclause(constraints.c.table_schema==current_schema) </span><span class="cx"> colmap = [constraints.c.constraint_type, key_constraints.c.column_name, key_constraints.c.referenced_table_schema, key_constraints.c.referenced_table_name, key_constraints.c.referenced_column_name] </span><del>- c = s.execute() </del><ins>+ c = connection.execute(s) </ins><span class="cx"> </span><span class="cx"> while True: </span><span class="cx"> row = c.fetchone() </span><span class="lines">@@ -178,6 +178,8 @@ </span><span class="cx"> if type=='PRIMARY KEY': </span><span class="cx"> table.c[constrained_column]._set_primary_key() </span><span class="cx"> elif type=='FOREIGN KEY': </span><del>- remotetable = Table(referred_table, engine, autoload = True, schema=referred_schema) </del><ins>+ if current_schema == referred_schema: + referred_schema = table.schema + remotetable = Table(referred_table, table.metadata, autoload=True, autoload_with=connection, schema=referred_schema) </ins><span class="cx"> table.c[constrained_column].append_item(schema.ForeignKey(remotetable.c[referred_column])) </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py (1287 => 1288)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py 2006-04-18 19:06:04 UTC (rev 1287) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py 2006-04-18 19:39:03 UTC (rev 1288) </span><span class="lines">@@ -169,7 +169,7 @@ </span><span class="cx"> return </span><span class="cx"> </span><span class="cx"> def post_exec(self, engine, proxy, compiled, parameters, **kwargs): </span><del>- if getattr(compiled, "isinsert", False) and self.context.last_inserted_ids is None: </del><ins>+ if getattr(compiled, "isinsert", False) and self._last_inserted_ids is None: </ins><span class="cx"> if not engine.dialect.use_oids: </span><span class="cx"> pass </span><span class="cx"> # will raise invalid error when they go to get them </span><span class="lines">@@ -178,7 +178,7 @@ </span><span class="cx"> cursor = proxy() </span><span class="cx"> if cursor.lastrowid is not None and table is not None and len(table.primary_key): </span><span class="cx"> s = sql.select(table.primary_key, table.oid_column == cursor.lastrowid) </span><del>- c = s.compile() </del><ins>+ c = s.compile(engine=engine) </ins><span class="cx"> cursor = proxy(str(c), c.get_params()) </span><span class="cx"> row = cursor.fetchone() </span><span class="cx"> self._last_inserted_ids = [v for v in row] </span><span class="lines">@@ -226,9 +226,9 @@ </span><span class="cx"> def defaultrunner(self, engine, proxy): </span><span class="cx"> return PGDefaultRunner(engine, proxy) </span><span class="cx"> </span><del>- def get_default_schema_name(self): </del><ins>+ def get_default_schema_name(self, connection): </ins><span class="cx"> if not hasattr(self, '_default_schema_name'): </span><del>- self._default_schema_name = text("select current_schema()", self).scalar() </del><ins>+ self._default_schema_name = connection.scalar("select current_schema()", None) </ins><span class="cx"> return self._default_schema_name </span><span class="cx"> </span><span class="cx"> def last_inserted_ids(self): </span><span class="lines">@@ -257,15 +257,13 @@ </span><span class="cx"> def dbapi(self): </span><span class="cx"> return self.module </span><span class="cx"> </span><del>- def reflecttable(self, table): </del><ins>+ def reflecttable(self, connection, table): </ins><span class="cx"> if self.version == 2: </span><span class="cx"> ischema_names = pg2_ischema_names </span><span class="cx"> else: </span><span class="cx"> ischema_names = pg1_ischema_names </span><span class="cx"> </span><del>- # give ischema the given table's engine with which to look up - # other tables, not 'self', since it could be a ProxyEngine - ischema.reflecttable(table.engine, table, ischema_names) </del><ins>+ ischema.reflecttable(connection, table, ischema_names) </ins><span class="cx"> </span><span class="cx"> class PGCompiler(ansisql.ANSICompiler): </span><span class="cx"> </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyenginebasepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py (1287 => 1288)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-04-18 19:06:04 UTC (rev 1287) +++ sqlalchemy/branches/schema/lib/sqlalchemy/engine/base.py 2006-04-18 19:39:03 UTC (rev 1288) </span><span class="lines">@@ -79,8 +79,8 @@ </span><span class="cx"> """subclasses override this method to provide the DBAPI module used to establish </span><span class="cx"> connections.""" </span><span class="cx"> raise NotImplementedError() </span><del>- def get_default_schema_name(self, proxy): - """returns the currently selected schema given an execution proxy""" </del><ins>+ def get_default_schema_name(self, connection): + """returns the currently selected schema given an connection""" </ins><span class="cx"> raise NotImplementedError() </span><span class="cx"> def execution_context(self): </span><span class="cx"> """returns a new ExecutionContext object.""" </span><span class="lines">@@ -229,7 +229,9 @@ </span><span class="cx"> def reflecttable(self, table, **kwargs): </span><span class="cx"> """reflects the columns in the given table from the database.""" </span><span class="cx"> return self.engine.reflecttable(table, connection=self, **kwargs) </span><del>- </del><ins>+ def default_schema_name(self): + return self.engine.dialect.get_default_schema_name(self) + </ins><span class="cx"> def _execute_raw(self, statement, parameters=None, cursor=None, echo=None, context=None, **kwargs): </span><span class="cx"> if cursor is None: </span><span class="cx"> cursor = self.connection.cursor() </span><span class="lines">@@ -255,11 +257,13 @@ </span><span class="cx"> try: </span><span class="cx"> self.engine.dialect.do_execute(c, statement, parameters, context=context) </span><span class="cx"> except Exception, e: </span><ins>+ self.engine.dialect.do_rollback(self.connection) </ins><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span><span class="cx"> def _executemany(self, c, statement, parameters, context=None): </span><span class="cx"> try: </span><span class="cx"> self.engine.dialect.do_executemany(c, statement, parameters, context=context) </span><span class="cx"> except Exception, e: </span><ins>+ self.engine.dialect.do_rollback(self.connection) </ins><span class="cx"> raise exceptions.SQLError(statement, parameters, e) </span><span class="cx"> def proxy(self, statement=None, parameters=None): </span><span class="cx"> """executes the given statement string and parameter object. </span><span class="lines">@@ -340,7 +344,6 @@ </span><span class="cx"> """returns a sql.text() object for performing literal queries.""" </span><span class="cx"> return sql.text(text, engine=self, *args, **kwargs) </span><span class="cx"> </span><del>- </del><span class="cx"> def _run_visitor(self, visitorcallable, element, connection=None, **kwargs): </span><span class="cx"> if connection is None: </span><span class="cx"> conn = self.connect() </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/sql.py (1287 => 1288)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-04-18 19:06:04 UTC (rev 1287) +++ sqlalchemy/branches/schema/lib/sqlalchemy/sql.py 2006-04-18 19:39:03 UTC (rev 1288) </span><span class="lines">@@ -465,7 +465,9 @@ </span><span class="cx"> the statement. """ </span><span class="cx"> </span><span class="cx"> if compiler is None: </span><del>- if engine is not None: </del><ins>+ if dialect is not None: + compiler = dialect.compiler(self, parameters) + elif engine is not None: </ins><span class="cx"> compiler = engine.compiler(self, parameters) </span><span class="cx"> elif self.engine is not None: </span><span class="cx"> compiler = self.engine.compiler(self, parameters) </span></span></pre> </div> </div> </body> </html> |