summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--alembic/ddl/sqlite.py15
-rw-r--r--docs/build/unreleased/1065.rst11
-rw-r--r--tests/test_sqlite.py5
3 files changed, 31 insertions, 0 deletions
diff --git a/alembic/ddl/sqlite.py b/alembic/ddl/sqlite.py
index 9b38766..f986c32 100644
--- a/alembic/ddl/sqlite.py
+++ b/alembic/ddl/sqlite.py
@@ -11,12 +11,17 @@ from sqlalchemy import cast
from sqlalchemy import JSON
from sqlalchemy import schema
from sqlalchemy import sql
+from sqlalchemy.ext.compiler import compiles
+from .base import alter_table
+from .base import format_table_name
+from .base import RenameTable
from .impl import DefaultImpl
from .. import util
if TYPE_CHECKING:
from sqlalchemy.engine.reflection import Inspector
+ from sqlalchemy.sql.compiler import DDLCompiler
from sqlalchemy.sql.elements import Cast
from sqlalchemy.sql.elements import ClauseElement
from sqlalchemy.sql.schema import Column
@@ -178,6 +183,16 @@ class SQLiteImpl(DefaultImpl):
)
+@compiles(RenameTable, "sqlite")
+def visit_rename_table(
+ element: "RenameTable", compiler: "DDLCompiler", **kw
+) -> str:
+ return "%s RENAME TO %s" % (
+ alter_table(compiler, element.table_name, element.schema),
+ format_table_name(compiler, element.new_table_name, None),
+ )
+
+
# @compiles(AddColumn, 'sqlite')
# def visit_add_column(element, compiler, **kw):
# return "%s %s" % (
diff --git a/docs/build/unreleased/1065.rst b/docs/build/unreleased/1065.rst
new file mode 100644
index 0000000..42a97a6
--- /dev/null
+++ b/docs/build/unreleased/1065.rst
@@ -0,0 +1,11 @@
+.. change::
+ :tags: bug, sqlite
+ :tickets: 1065
+
+ Fixed bug where the SQLite implementation of
+ :meth:`.Operations.rename_table` would render an explicit schema name for
+ both the old and new table name, which while is the standard ALTER syntax,
+ is not accepted by SQLite's syntax which doesn't support a rename across
+ schemas. In particular, the syntax issue would prevent batch mode from
+ working for SQLite databases that made use of attached databases (which are
+ treated as "schemas" in SQLAlchemy).
diff --git a/tests/test_sqlite.py b/tests/test_sqlite.py
index 3915343..b8edeaa 100644
--- a/tests/test_sqlite.py
+++ b/tests/test_sqlite.py
@@ -81,6 +81,11 @@ class SQLiteTest(TestBase):
op.add_column("t1", Column("c1", Integer, comment="c1 comment"))
context.assert_("ALTER TABLE t1 ADD COLUMN c1 INTEGER")
+ def test_rename_table_w_schema(self):
+ context = op_fixture("sqlite")
+ op.rename_table("old_name", "new_name", schema="my_schema")
+ context.assert_("ALTER TABLE my_schema.old_name RENAME TO new_name")
+
class SQLiteDefaultCompareTest(TestBase):
__only_on__ = "sqlite"