[Sqlalchemy-commits] [1479] sqlalchemy/branches/schema/lib/sqlalchemy/databases: initial oracle conv
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-05-21 17:00:28
|
<!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>[1479] sqlalchemy/branches/schema/lib/sqlalchemy/databases: initial oracle conversion, not tested yet</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1479</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-05-21 12:00:17 -0500 (Sun, 21 May 2006)</dd> </dl> <h3>Log Message</h3> <pre>initial oracle conversion, not tested yet</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasesoraclepy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasespostgrespy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemydatabasesoraclepy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py (1478 => 1479)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py 2006-05-21 16:48:14 UTC (rev 1478) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/oracle.py 2006-05-21 17:00:17 UTC (rev 1479) </span><span class="lines">@@ -7,11 +7,14 @@ </span><span class="cx"> </span><span class="cx"> import sys, StringIO, string </span><span class="cx"> </span><ins>+import sqlalchemy.util as util </ins><span class="cx"> import sqlalchemy.sql as sql </span><ins>+import sqlalchemy.engine as engine +import sqlalchemy.engine.default as default </ins><span class="cx"> import sqlalchemy.schema as schema </span><span class="cx"> import sqlalchemy.ansisql as ansisql </span><del>-from sqlalchemy import * </del><span class="cx"> import sqlalchemy.types as sqltypes </span><ins>+import sqlalchemy.exceptions as exceptions </ins><span class="cx"> </span><span class="cx"> try: </span><span class="cx"> import cx_Oracle </span><span class="lines">@@ -93,8 +96,6 @@ </span><span class="cx"> -- order multiple primary keys correctly </span><span class="cx"> ORDER BY ac.constraint_name, loc.position""" </span><span class="cx"> </span><del>-def engine(*args, **params): - return OracleSQLEngine(*args, **params) </del><span class="cx"> </span><span class="cx"> def descriptor(): </span><span class="cx"> return {'name':'oracle', </span><span class="lines">@@ -104,12 +105,14 @@ </span><span class="cx"> ('user', 'Username', None), </span><span class="cx"> ('password', 'Password', None) </span><span class="cx"> ]} </span><ins>+ +class OracleExecutionContext(default.DefaultExecutionContext): + pass </ins><span class="cx"> </span><del>-class OracleSQLEngine(ansisql.ANSISQLEngine): - def __init__(self, opts, use_ansi = True, module = None, threaded=True, **params): - self._use_ansi = use_ansi - self.opts = self._translate_connect_args((None, 'dsn', 'user', 'password'), opts) - opts['threaded'] = threaded </del><ins>+class OracleDialect(ansisql.ANSIDialect): + def __init__(self, use_ansi=True, module=None, threaded=True, **params): + self.use_ansi = use_ansi + self.threaded = threaded </ins><span class="cx"> if module is None: </span><span class="cx"> self.module = cx_Oracle </span><span class="cx"> else: </span><span class="lines">@@ -119,27 +122,33 @@ </span><span class="cx"> def dbapi(self): </span><span class="cx"> return self.module </span><span class="cx"> </span><del>- def connect_args(self): - return [[], self.opts] </del><ins>+ def create_connect_args(self, url): + opts = url.translate_connect_args([None, 'dsn', 'user', 'password']) + opts['threaded'] = self.threaded + return ([], opts) </ins><span class="cx"> </span><span class="cx"> def type_descriptor(self, typeobj): </span><span class="cx"> return sqltypes.adapt_type(typeobj, colspecs) </span><span class="cx"> </span><del>- def last_inserted_ids(self): - return self.context.last_inserted_ids - </del><span class="cx"> def oid_column_name(self): </span><span class="cx"> return "rowid" </span><span class="cx"> </span><ins>+ def create_execution_context(self): + return OracleExecutionContext(self) + </ins><span class="cx"> def compiler(self, statement, bindparams, **kwargs): </span><del>- return OracleCompiler(self, statement, bindparams, use_ansi=self._use_ansi, **kwargs) </del><ins>+ return OracleCompiler(self, statement, bindparams, **kwargs) + def schemagenerator(self, *args, **kwargs): + return OracleSchemaGenerator(*args, **kwargs) + def schemadropper(self, *args, **kwargs): + return OracleSchemaDropper(*args, **kwargs) + def defaultrunner(self, engine, proxy): + return OracleDefaultRunner(engine, proxy) </ins><span class="cx"> </span><del>- def schemagenerator(self, **params): - return OracleSchemaGenerator(self, **params) - def schemadropper(self, **params): - return OracleSchemaDropper(self, **params) - def defaultrunner(self, proxy): - return OracleDefaultRunner(self, proxy) </del><ins>+ + def has_table(self, connection, table_name): + cursor = connection.execute("""select table_name from all_tables where table_name=:table_name""", {'name':table_name}) + return bool( not not cursor.rowcount ) </ins><span class="cx"> </span><span class="cx"> def reflecttable(self, table): </span><span class="cx"> c = self.execute ("select COLUMN_NAME, DATA_TYPE, DATA_LENGTH, DATA_PRECISION, DATA_SCALE, NULLABLE, DATA_DEFAULT from ALL_TAB_COLUMNS where TABLE_NAME = :table_name", {'table_name':table.name.upper()}) </span><span class="lines">@@ -195,28 +204,18 @@ </span><span class="cx"> ) </span><span class="cx"> ) </span><span class="cx"> </span><del>- def last_inserted_ids(self): - return self.context.last_inserted_ids - - def pre_exec(self, proxy, compiled, parameters, **kwargs): - pass - - def _executemany(self, c, statement, parameters): </del><ins>+ def do_executemany(self, c, statement, parameters, context=None): </ins><span class="cx"> rowcount = 0 </span><span class="cx"> for param in parameters: </span><span class="cx"> c.execute(statement, param) </span><span class="cx"> rowcount += c.rowcount </span><del>- self.context.rowcount = rowcount </del><ins>+ if context is not None: + context._rowcount = rowcount </ins><span class="cx"> </span><span class="cx"> class OracleCompiler(ansisql.ANSICompiler): </span><span class="cx"> """oracle compiler modifies the lexical structure of Select statements to work under </span><span class="cx"> non-ANSI configured Oracle databases, if the use_ansi flag is False.""" </span><span class="cx"> </span><del>- def __init__(self, engine, statement, parameters, use_ansi = True, **kwargs): - self._outertable = None - self._use_ansi = use_ansi - ansisql.ANSICompiler.__init__(self, statement, parameters, engine=engine, **kwargs) - </del><span class="cx"> def default_from(self): </span><span class="cx"> """called when a SELECT statement has no froms, and no FROM clause is to be appended. </span><span class="cx"> gives Oracle a chance to tack on a "FROM DUAL" to the string output. """ </span><span class="lines">@@ -226,7 +225,7 @@ </span><span class="cx"> return len(func.clauses) > 0 </span><span class="cx"> </span><span class="cx"> def visit_join(self, join): </span><del>- if self._use_ansi: </del><ins>+ if self.dialect.use_ansi: </ins><span class="cx"> return ansisql.ANSICompiler.visit_join(self, join) </span><span class="cx"> </span><span class="cx"> self.froms[join] = self.get_from_text(join.left) + ", " + self.get_from_text(join.right) </span><span class="lines">@@ -251,7 +250,7 @@ </span><span class="cx"> </span><span class="cx"> def visit_column(self, column): </span><span class="cx"> ansisql.ANSICompiler.visit_column(self, column) </span><del>- if not self._use_ansi and self._outertable is not None and column.table is self._outertable: </del><ins>+ if not self.dialect.use_ansi and getattr(self, '_outertable', None) is not None and column.table is self._outertable: </ins><span class="cx"> self.strings[column] = self.strings[column] + "(+)" </span><span class="cx"> </span><span class="cx"> def visit_insert(self, insert): </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py (1478 => 1479)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py 2006-05-21 16:48:14 UTC (rev 1478) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py 2006-05-21 17:00:17 UTC (rev 1479) </span><span class="lines">@@ -260,7 +260,6 @@ </span><span class="cx"> else: </span><span class="cx"> return None </span><span class="cx"> </span><del>- </del><span class="cx"> def do_executemany(self, c, statement, parameters, context=None): </span><span class="cx"> """we need accurate rowcounts for updates, inserts and deletes. psycopg2 is not nice enough </span><span class="cx"> to produce this correctly for an executemany, so we do our own executemany here.""" </span></span></pre> </div> </div> </body> </html> |