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
)
+@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" % (
--- /dev/null
+.. 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).
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"