From: Mike Bayer Date: Thu, 20 Jul 2006 00:07:30 +0000 (+0000) Subject: implemented latest patch on [ticket:105], modified to support X-Git-Tag: rel_0_2_6~2 X-Git-Url: http://git.ipfire.org/gitweb/index.cgi?a=commitdiff_plain;h=81f6188b400b7b65819b738b3621378874dfef35;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git implemented latest patch on [ticket:105], modified to support new ForeignKeyConstraint upon reflection --- diff --git a/lib/sqlalchemy/databases/oracle.py b/lib/sqlalchemy/databases/oracle.py index 519f5cb65c..04950674ae 100644 --- a/lib/sqlalchemy/databases/oracle.py +++ b/lib/sqlalchemy/databases/oracle.py @@ -95,7 +95,7 @@ AND ac.constraint_name = loc.constraint_name AND ac.r_owner = rem.owner(+) AND ac.r_constraint_name = rem.constraint_name(+) -- order multiple primary keys correctly -ORDER BY ac.constraint_name, loc.position""" +ORDER BY ac.constraint_name, loc.position, rem.position""" def descriptor(): @@ -221,6 +221,7 @@ class OracleDialect(ansisql.ANSIDialect): c = connection.execute(constraintSQL, {'table_name' : table.name.upper(), 'owner' : owner}) + fks = {} while True: row = c.fetchone() if row is None: @@ -230,13 +231,19 @@ class OracleDialect(ansisql.ANSIDialect): if cons_type == 'P': table.c[local_column]._set_primary_key() elif cons_type == 'R': - #table.append_item(ForeignKeyConstraint(value[0], value[1], name=name)) - table.c[local_column].append_item( - schema.ForeignKey(schema.Table(remote_table, - table.metadata, - autoload=True).c[remote_column] - ) - ) + try: + fk = fks[cons_name] + except KeyError: + fk = ([], []) + fks[cons_name] = fk + refspec = ".".join([remote_table, remote_column]) + if local_column not in fk[0]: + fk[0].append(local_column) + if refspec not in fk[1]: + fk[1].append(refspec) + + for name, value in fks.iteritems(): + table.append_item(schema.ForeignKeyConstraint(value[0], value[1], name=name)) def do_executemany(self, c, statement, parameters, context=None): rowcount = 0