From 1117b0bf814fa35048e5f420778189d7e8ad8f41 Mon Sep 17 00:00:00 2001 From: Mike Bayer Date: Fri, 13 Jan 2006 01:23:55 +0000 Subject: [PATCH] mysql table introspection uses 'describe' to work with 3/4/5 no foreign key introspection available, sorry ! --- lib/sqlalchemy/databases/mysql.py | 24 +++++++++++++++++++++++- test/engines.py | 3 ++- 2 files changed, 25 insertions(+), 2 deletions(-) diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py index f1d4630c83..fda41a3fc4 100644 --- a/lib/sqlalchemy/databases/mysql.py +++ b/lib/sqlalchemy/databases/mysql.py @@ -146,7 +146,29 @@ class MySQLEngine(ansisql.ANSISQLEngine): return self.module def reflecttable(self, table): - ischema.reflecttable(self, table, ischema_names, use_mysql=True) + # to use information_schema: + #ischema.reflecttable(self, table, ischema_names, use_mysql=True) + + c = self.execute("describe " + table.name, {}) + while True: + row = c.fetchone() + if row is None: + break + #print "row! " + repr(row) + (name, type, nullable, primary_key, default) = (row[0], row[1], row[2] == 'YES', row[3] == 'PRI', row[4]) + + match = re.match(r'(\w+)(\(.*?\))?', type) + coltype = match.group(1) + args = match.group(2) + + #print "coltype: " + repr(coltype) + " args: " + repr(args) + coltype = ischema_names.get(coltype, MSString) + if args is not None: + args = re.findall(r'(\d+)', args) + #print "args! " +repr(args) + coltype = coltype(*[int(a) for a in args]) + table.append_item(schema.Column(name, coltype, primary_key=primary_key, nullable=nullable, default=default)) + class MySQLTableImpl(sql.TableImpl): """attached to a schema.Table to provide it with a Selectable interface diff --git a/test/engines.py b/test/engines.py index 0ed537bca3..b649b5a70c 100644 --- a/test/engines.py +++ b/test/engines.py @@ -59,7 +59,8 @@ class EngineTest(PersistTest): try: # create a join from the two tables, this insures that # theres a foreign key set up -# addresses.c.remote_user_id.append_item(ForeignKey('engine_users.user_id')) + if testbase.db.engine.__module__.endswith('mysql'): + addresses.c.remote_user_id.append_item(ForeignKey('engine_users.user_id')) j = join(users, addresses) print str(j.onclause) self.assert_((users.c.user_id==addresses.c.remote_user_id).compare(j.onclause)) -- 2.47.2