From: Phillip Cloud Date: Mon, 16 Jul 2018 14:10:55 +0000 (-0400) Subject: Fix quoting schemas in _get_table_sql for the SQLite backend X-Git-Tag: rel_1_3_0b1~121^2 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=893eac06e511f3765c0c89bab76d7933d83ffccc;p=thirdparty%2Fsqlalchemy%2Fsqlalchemy.git Fix quoting schemas in _get_table_sql for the SQLite backend Fixed issue where the "schema" name used for a SQLite database within table reflection would not quote the schema name correctly. Pull request courtesy Phillip Cloud. Change-Id: I2770788c1f094a7743209250ec26b5ef5fb2d9e8 Pull-request: https://github.com/zzzeek/sqlalchemy/pull/463 --- diff --git a/doc/build/changelog/unreleased_12/pr824.rst b/doc/build/changelog/unreleased_12/pr824.rst new file mode 100644 index 0000000000..a78bf24553 --- /dev/null +++ b/doc/build/changelog/unreleased_12/pr824.rst @@ -0,0 +1,6 @@ +.. change:: + :tag: bug, sqlite + + Fixed issue where the "schema" name used for a SQLite database within table + reflection would not quote the schema name correctly. Pull request + courtesy Phillip Cloud. diff --git a/lib/sqlalchemy/dialects/sqlite/base.py b/lib/sqlalchemy/dialects/sqlite/base.py index c6932be8f3..cc17b6c9b8 100644 --- a/lib/sqlalchemy/dialects/sqlite/base.py +++ b/lib/sqlalchemy/dialects/sqlite/base.py @@ -1567,20 +1567,25 @@ class SQLiteDialect(default.DefaultDialect): @reflection.cache def _get_table_sql(self, connection, table_name, schema=None, **kw): + if schema: + schema_expr = "%s." % ( + self.identifier_preparer.quote_identifier(schema)) + else: + schema_expr = "" try: s = ("SELECT sql FROM " " (SELECT * FROM %(schema)ssqlite_master UNION ALL " " SELECT * FROM %(schema)ssqlite_temp_master) " "WHERE name = '%(table)s' " "AND type = 'table'" % { - "schema": ("%s." % schema) if schema else "", + "schema": schema_expr, "table": table_name}) rs = connection.execute(s) except exc.DBAPIError: s = ("SELECT sql FROM %(schema)ssqlite_master " "WHERE name = '%(table)s' " "AND type = 'table'" % { - "schema": ("%s." % schema) if schema else "", + "schema": schema_expr, "table": table_name}) rs = connection.execute(s) return rs.scalar() diff --git a/test/dialect/test_sqlite.py b/test/dialect/test_sqlite.py index 5e2535b30c..9b1d5d7ea5 100644 --- a/test/dialect/test_sqlite.py +++ b/test/dialect/test_sqlite.py @@ -1127,6 +1127,31 @@ class ReflectHeadlessFKsTest(fixtures.TestBase): assert b.c.id.references(a.c.id) +class KeywordInDatabaseNameTest(fixtures.TestBase): + __only_on__ = 'sqlite' + + @classmethod + def setup_class(cls): + with testing.db.begin() as conn: + conn.execute("ATTACH %r AS \"default\"" % conn.engine.url.database) + conn.execute('CREATE TABLE "default".a (id INTEGER PRIMARY KEY)') + + @classmethod + def teardown_class(cls): + with testing.db.begin() as conn: + try: + conn.execute('drop table "default".a') + except Exception: + pass + conn.execute('DETACH DATABASE "default"') + + def test_reflect(self): + with testing.db.begin() as conn: + meta = MetaData(bind=conn, schema='default') + meta.reflect() + assert 'default.a' in meta.tables + + class ConstraintReflectionTest(fixtures.TestBase): __only_on__ = 'sqlite'