[Sqlalchemy-commits] [1329] sqlalchemy/branches/schema/test: mysql up
Brought to you by:
zzzeek
From: <co...@sq...> - 2006-04-24 01:11:09
|
<!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>[1329] sqlalchemy/branches/schema/test: mysql up</title> </head> <body> <div id="msg"> <dl> <dt>Revision</dt> <dd>1329</dd> <dt>Author</dt> <dd>zzzeek</dd> <dt>Date</dt> <dd>2006-04-23 20:10:41 -0500 (Sun, 23 Apr 2006)</dd> </dl> <h3>Log Message</h3> <pre>mysql up attempted tweak to sqlsoup</pre> <h3>Modified Paths</h3> <ul> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasesmysqlpy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/mysql.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemydatabasespostgrespy">sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py</a></li> <li><a href="#sqlalchemybranchesschemalibsqlalchemyextsqlsouppy">sqlalchemy/branches/schema/lib/sqlalchemy/ext/sqlsoup.py</a></li> <li><a href="#sqlalchemybranchesschematesttesttypespy">sqlalchemy/branches/schema/test/testtypes.py</a></li> </ul> </div> <div id="patch"> <h3>Diff</h3> <a id="sqlalchemybranchesschemalibsqlalchemydatabasesmysqlpy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/mysql.py (1328 => 1329)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/mysql.py 2006-04-23 23:55:03 UTC (rev 1328) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/mysql.py 2006-04-24 01:10:41 UTC (rev 1329) </span><span class="lines">@@ -56,7 +56,7 @@ </span><span class="cx"> class MSTime(sqltypes.Time): </span><span class="cx"> def get_col_spec(self): </span><span class="cx"> return "TIME" </span><del>- def convert_result_value(self, value, engine): </del><ins>+ def convert_result_value(self, value, dialect): </ins><span class="cx"> # convert from a timedelta value </span><span class="cx"> if value is not None: </span><span class="cx"> return datetime.time(value.seconds/60/60, value.seconds/60%60, value.seconds - (value.seconds/60*60)) </span><span class="lines">@@ -130,67 +130,60 @@ </span><span class="cx"> ('host',"Hostname", None), </span><span class="cx"> ]} </span><span class="cx"> </span><del>-class MySQLEngine(ansisql.ANSISQLEngine): - def __init__(self, opts, module = None, **params): </del><ins>+ +class MySQLExecutionContext(default.DefaultExecutionContext): + def post_exec(self, engine, proxy, compiled, parameters, **kwargs): + if getattr(compiled, "isinsert", False): + self._last_inserted_ids = [proxy().lastrowid] + +class MySQLDialect(ansisql.ANSIDialect): + def __init__(self, module = None, **kwargs): </ins><span class="cx"> if module is None: </span><span class="cx"> self.module = mysql </span><del>- self.opts = self._translate_connect_args(('host', 'db', 'user', 'passwd'), opts) - ansisql.ANSISQLEngine.__init__(self, **params) </del><ins>+ ansisql.ANSIDialect.__init__(self, **kwargs) </ins><span class="cx"> </span><del>- def connect_args(self): - return [[], self.opts] </del><ins>+ def create_connect_args(self, opts): + opts = self._translate_connect_args(('host', 'db', 'user', 'passwd'), opts) + return [[], opts] </ins><span class="cx"> </span><ins>+ def create_execution_context(self): + return MySQLExecutionContext(self) + </ins><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 supports_sane_rowcount(self): </span><span class="cx"> return False </span><span class="cx"> </span><span class="cx"> def compiler(self, statement, bindparams, **kwargs): </span><del>- return MySQLCompiler(statement, bindparams, engine=self, **kwargs) </del><ins>+ return MySQLCompiler(self, statement, bindparams, **kwargs) </ins><span class="cx"> </span><del>- def schemagenerator(self, **params): - return MySQLSchemaGenerator(self, **params) </del><ins>+ def schemagenerator(self, *args, **kwargs): + return MySQLSchemaGenerator(*args, **kwargs) </ins><span class="cx"> </span><del>- def schemadropper(self, **params): - return MySQLSchemaDropper(self, **params) </del><ins>+ def schemadropper(self, *args, **kwargs): + return MySQLSchemaDropper(*args, **kwargs) </ins><span class="cx"> </span><span class="cx"> def get_default_schema_name(self): </span><span class="cx"> if not hasattr(self, '_default_schema_name'): </span><span class="cx"> self._default_schema_name = text("select database()", self).scalar() </span><span class="cx"> return self._default_schema_name </span><del>- - def last_inserted_ids(self): - return self.context.last_inserted_ids - - def post_exec(self, proxy, compiled, parameters, **kwargs): - if getattr(compiled, "isinsert", False): - self.context.last_inserted_ids = [proxy().lastrowid] </del><span class="cx"> </span><del>- # executemany just runs normally, since we arent using rowcount at all with mysql -# def _executemany(self, c, statement, parameters): - # """we need accurate rowcounts for updates, inserts and deletes. mysql is *also* is not nice enough - # to produce this correctly for an executemany, so we do our own executemany here.""" - # rowcount = 0 - # for param in parameters: - # c.execute(statement, param) - # rowcount += c.rowcount - # self.context.rowcount = rowcount - </del><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 has_table(self, connection, table_name): + cursor = connection.execute("show table status like '" + table_name + "'") + return bool( not not cursor.rowcount ) + + def reflecttable(self, connection, table): </ins><span class="cx"> # to use information_schema: </span><span class="cx"> #ischema.reflecttable(self, table, ischema_names, use_mysql=True) </span><span class="cx"> </span><del>- tabletype, foreignkeyD = self.moretableinfo(table=table) </del><ins>+ tabletype, foreignkeyD = self.moretableinfo(connection, table=table) </ins><span class="cx"> table.kwargs['mysql_engine'] = tabletype </span><span class="cx"> </span><del>- c = self.execute("describe " + table.name, {}) </del><ins>+ c = connection.execute("describe " + table.name, {}) </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">@@ -220,7 +213,7 @@ </span><span class="cx"> default=default </span><span class="cx"> ))) </span><span class="cx"> </span><del>- def moretableinfo(self, table): </del><ins>+ def moretableinfo(self, connection, table): </ins><span class="cx"> """Return (tabletype, {colname:foreignkey,...}) </span><span class="cx"> execute(SHOW CREATE TABLE child) => </span><span class="cx"> CREATE TABLE `child` ( </span><span class="lines">@@ -229,7 +222,7 @@ </span><span class="cx"> KEY `par_ind` (`parent_id`), </span><span class="cx"> CONSTRAINT `child_ibfk_1` FOREIGN KEY (`parent_id`) REFERENCES `parent` (`id`) ON DELETE CASCADE\n) TYPE=InnoDB </span><span class="cx"> """ </span><del>- c = self.execute("SHOW CREATE TABLE " + table.name, {}) </del><ins>+ c = connection.execute("SHOW CREATE TABLE " + table.name, {}) </ins><span class="cx"> desc = c.fetchone()[1].strip() </span><span class="cx"> tabletype = '' </span><span class="cx"> lastparen = re.search(r'\)[^\)]*\Z', desc) </span><span class="lines">@@ -290,3 +283,5 @@ </span><span class="cx"> def visit_index(self, index): </span><span class="cx"> self.append("\nDROP INDEX " + index.name + " ON " + index.table.name) </span><span class="cx"> self.execute() </span><ins>+ +dialect = MySQLDialect </ins><span class="cx">\ No newline at end of file </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemydatabasespostgrespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py (1328 => 1329)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py 2006-04-23 23:55:03 UTC (rev 1328) +++ sqlalchemy/branches/schema/lib/sqlalchemy/databases/postgres.py 2006-04-24 01:10:41 UTC (rev 1329) </span><span class="lines">@@ -181,11 +181,9 @@ </span><span class="cx"> ]} </span><span class="cx"> </span><span class="cx"> class PGExecutionContext(default.DefaultExecutionContext): </span><del>- def pre_exec(self, engine, proxy, statement, parameters, **kwargs): - return </del><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._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">@@ -227,6 +225,9 @@ </span><span class="cx"> opts['port'] = str(opts['port']) </span><span class="cx"> return ([], opts) </span><span class="cx"> </span><ins>+ def create_execution_context(self): + return PGExecutionContext(self) + </ins><span class="cx"> def type_descriptor(self, typeobj): </span><span class="cx"> if self.version == 2: </span><span class="cx"> return sqltypes.adapt_type(typeobj, pg2_colspecs) </span></span></pre></div> <a id="sqlalchemybranchesschemalibsqlalchemyextsqlsouppy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/lib/sqlalchemy/ext/sqlsoup.py (1328 => 1329)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/lib/sqlalchemy/ext/sqlsoup.py 2006-04-23 23:55:03 UTC (rev 1328) +++ sqlalchemy/branches/schema/lib/sqlalchemy/ext/sqlsoup.py 2006-04-24 01:10:41 UTC (rev 1329) </span><span class="lines">@@ -37,9 +37,9 @@ </span><span class="cx"> args may either be an SQLEngine or a set of arguments suitable </span><span class="cx"> for passing to create_engine </span><span class="cx"> """ </span><del>- from sqlalchemy.engine import SQLEngine </del><ins>+ from sqlalchemy.sql import Engine </ins><span class="cx"> # meh, sometimes having method overloading instead of kwargs would be easier </span><del>- if isinstance(args[0], SQLEngine): </del><ins>+ if isinstance(args[0], Engine): </ins><span class="cx"> engine = args.pop(0) </span><span class="cx"> if args or kwargs: </span><span class="cx"> raise ArgumentError('Extra arguments not allowed when engine is given') </span></span></pre></div> <a id="sqlalchemybranchesschematesttesttypespy"></a> <div class="modfile"><h4>Modified: sqlalchemy/branches/schema/test/testtypes.py (1328 => 1329)</h4> <pre class="diff"><span> <span class="info">--- sqlalchemy/branches/schema/test/testtypes.py 2006-04-23 23:55:03 UTC (rev 1328) +++ sqlalchemy/branches/schema/test/testtypes.py 2006-04-24 01:10:41 UTC (rev 1329) </span><span class="lines">@@ -89,7 +89,7 @@ </span><span class="cx"> ) </span><span class="cx"> </span><span class="cx"> for aCol in testTable.c: </span><del>- self.assertEquals(expectedResults[aCol.name], db.schemagenerator().get_column_specification(aCol)) </del><ins>+ self.assertEquals(expectedResults[aCol.name], db.dialect.schemagenerator(db, None).get_column_specification(aCol)) </ins><span class="cx"> </span><span class="cx"> class UnicodeTest(AssertMixin): </span><span class="cx"> """tests the Unicode type. also tests the TypeDecorator with instances in the types package.""" </span><span class="lines">@@ -113,15 +113,15 @@ </span><span class="cx"> self.assert_(isinstance(x['unicode_data'], unicode) and x['unicode_data'] == unicodedata) </span><span class="cx"> if isinstance(x['plain_data'], unicode): </span><span class="cx"> # SQLLite returns even non-unicode data as unicode </span><del>- self.assert_(sys.modules[db.engine.__module__].descriptor()['name'] == 'sqlite') </del><ins>+ self.assert_(db.name == 'sqlite') </ins><span class="cx"> self.echo("its sqlite !") </span><span class="cx"> else: </span><span class="cx"> self.assert_(not isinstance(x['plain_data'], unicode) and x['plain_data'] == rawdata) </span><span class="cx"> def testengineparam(self): </span><span class="cx"> """tests engine-wide unicode conversion""" </span><del>- prev_unicode = db.engine.convert_unicode </del><ins>+ prev_unicode = db.engine.dialect.convert_unicode </ins><span class="cx"> try: </span><del>- db.engine.convert_unicode = True </del><ins>+ db.engine.dialect.convert_unicode = True </ins><span class="cx"> rawdata = 'Alors vous imaginez ma surprise, au lever du jour, quand une dr\xc3\xb4le de petit voix m\xe2\x80\x99a r\xc3\xa9veill\xc3\xa9. Elle disait: \xc2\xab S\xe2\x80\x99il vous pla\xc3\xaet\xe2\x80\xa6 dessine-moi un mouton! \xc2\xbb\n' </span><span class="cx"> unicodedata = rawdata.decode('utf-8') </span><span class="cx"> unicode_table.insert().execute(unicode_data=unicodedata, plain_data=rawdata) </span><span class="lines">@@ -131,7 +131,7 @@ </span><span class="cx"> self.assert_(isinstance(x['unicode_data'], unicode) and x['unicode_data'] == unicodedata) </span><span class="cx"> self.assert_(isinstance(x['plain_data'], unicode) and x['plain_data'] == unicodedata) </span><span class="cx"> finally: </span><del>- db.engine.convert_unicode = prev_unicode </del><ins>+ db.engine.dialect.convert_unicode = prev_unicode </ins><span class="cx"> </span><span class="cx"> class BinaryTest(AssertMixin): </span><span class="cx"> def setUpAll(self): </span><span class="lines">@@ -179,7 +179,7 @@ </span><span class="cx"> collist = [Column('user_id', INT, primary_key = True), Column('user_name', VARCHAR(20)), Column('user_datetime', DateTime), </span><span class="cx"> Column('user_date', Date), Column('user_time', Time)] </span><span class="cx"> </span><del>- if db.engine.__module__.endswith('mysql') or db.engine.__module__.endswith('mssql'): </del><ins>+ if db.engine.name == 'mysql' or db.engine.name == 'mssql': </ins><span class="cx"> # strip microseconds -- not supported by this engine (should be an easier way to detect this) </span><span class="cx"> for d in insert_data: </span><span class="cx"> if d[2] is not None: </span></span></pre> </div> </div> </body> </html> |