summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMike Bayer <mike_mp@zzzcomputing.com>2007-04-29 20:08:55 +0000
committerMike Bayer <mike_mp@zzzcomputing.com>2007-04-29 20:08:55 +0000
commit8d2c9ae434a9026e9a198120c9a7b6faf0346cd7 (patch)
tree457e9b5a04c209a673bd1c769a2d042a2593d921
parent22278d02b943c005af1d416fd7a7016da535f4a8 (diff)
downloadsqlalchemy-8d2c9ae434a9026e9a198120c9a7b6faf0346cd7.tar.gz
- mysql uses "DESCRIBE [<schemaname>].<tablename>", catching exceptions
if table doesnt exist, in order to determine if a table exists. this supports unicode table names as well as schema names. tested with MySQL5 but should work with 4.1 series as well. (#557)
-rw-r--r--CHANGES4
-rw-r--r--lib/sqlalchemy/databases/mysql.py23
-rw-r--r--test/sql/unicode.py4
3 files changed, 22 insertions, 9 deletions
diff --git a/CHANGES b/CHANGES
index 441be8b03..934733d0b 100644
--- a/CHANGES
+++ b/CHANGES
@@ -116,6 +116,10 @@
- mysql
- support for SSL arguments given as inline within URL query string,
prefixed with "ssl_", courtesy terjeros@gmail.com.
+ - mysql uses "DESCRIBE [<schemaname>].<tablename>", catching exceptions
+ if table doesnt exist, in order to determine if a table exists.
+ this supports unicode table names as well as schema names. tested
+ with MySQL5 but should work with 4.1 series as well. (#557)
- extensions
- big fix to AssociationProxy so that multiple AssociationProxy
objects can be associated with a single association collection.
diff --git a/lib/sqlalchemy/databases/mysql.py b/lib/sqlalchemy/databases/mysql.py
index c33b515b5..0903befe9 100644
--- a/lib/sqlalchemy/databases/mysql.py
+++ b/lib/sqlalchemy/databases/mysql.py
@@ -364,11 +364,24 @@ class MySQLDialect(ansisql.ANSIDialect):
def has_table(self, connection, table_name, schema=None):
# TODO: this does not work for table names that contain multibyte characters.
- # i have tried dozens of approaches here with no luck. statements like
- # DESCRIBE and SHOW CREATE TABLE work better, but they raise an error when
- # the table does not exist.
- cursor = connection.execute("show table status like %s", [table_name])
- return bool( not not cursor.rowcount )
+
+ # http://dev.mysql.com/doc/refman/5.0/en/error-messages-server.html
+
+ # Error: 1146 SQLSTATE: 42S02 (ER_NO_SUCH_TABLE)
+ # Message: Table '%s.%s' doesn't exist
+
+ # Error: 1046 SQLSTATE: 3D000 (ER_NO_DB_ERROR)
+ # Message: No database selected
+
+ try:
+ name = schema and ("%s.%s" % (schema, table_name)) or table_name
+ connection.execute("DESCRIBE `%s`" % name)
+ return True
+ except exceptions.SQLError, e:
+ if e.orig.args[0] in (1146, 1046):
+ return False
+ else:
+ raise
def reflecttable(self, connection, table):
# reference: http://dev.mysql.com/doc/refman/5.0/en/name-case-sensitivity.html
diff --git a/test/sql/unicode.py b/test/sql/unicode.py
index 9dfc75059..65a7cce0d 100644
--- a/test/sql/unicode.py
+++ b/test/sql/unicode.py
@@ -28,10 +28,6 @@ class UnicodeSchemaTest(testbase.PersistTest):
def tearDownAll(self):
metadata.drop_all()
- # has_table() doesnt handle the unicode names on mysql
- if testbase.db.name == 'mysql':
- t2.drop()
-
def test_insert(self):
t1.insert().execute({u'méil':1, u'éXXm':5})
t2.insert().execute({'a':1, 'b':1})