我们有一小段代码使用SQLAlchemy将源数据库(在我们的例子中是MSSQL)(部分)复制到目标数据库(在我们的例子中是SQLite in memory)。作为此复制的一部分,我们将表信息从源复制到目标:
for table in source:
table.tometadata(metadata_target)
# some more stuff (hack: could alter table here)
metadata_target.create_all()
复制表格时,DEFAULT
条款会逐字复制。例如。 SQLite中复制的列可能如下所示:
CREATE TABLE "TableName" (
-- ...
"TimeStamp" DATETIME DEFAULT (GETUTCDATE()) NOT NULL,
-- ...
)
这不起作用,因为GETUTCDATE()
不是SQLite中的函数。
我正在寻找SQLAlchemy DDL编译器(我猜)的钩子,我可以根据值和方言修改或抑制DEFAULT
部分的生成(例如,替换{{ 1}}与GETUTCDATE()
或完全删除带有DATE('now')
的默认子句)。
我见过this part of the documentation(我们在交叉编译期间使用它来处理某些类型),但我不知道如何使用它来处理NEWID()
子句。我甚至不确定它是否是正确的工具。我可以解决这个问题(通过SQLAlchemy“创建”后改变表格),但我更喜欢更通用的解决方案。
答案 0 :(得分:1)
您还可以为SQLite连接实现GETUTCDATE函数。
答案 1 :(得分:1)
还有另一个解决方案,但搞砸了,你的数据库变得无法使用。它会起作用,但不推荐。 SQLite将模式保存在名为sqlite_master的表中。您无法正常写入此表,但使用pragma writable_schema=on
可以编写。做任何你想要的改变,然后关闭编译。最后,为了确保您不会因为在SQLite下更改架构而导致问题,请关闭数据库并重新打开它。