在创建表时修改DEFAULT子句

时间:2012-03-06 10:04:46

标签: python sqlalchemy

我们有一小段代码使用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“创建”后改变表格),但我更喜欢更通用的解决方案。

2 个答案:

答案 0 :(得分:1)

您还可以为SQLite连接实现GETUTCDATE函数。

答案 1 :(得分:1)

还有另一个解决方案,但搞砸了,你的数据库变得无法使用。它会起作用,但不推荐。 SQLite将模式保存在名为sqlite_master的表中。您无法正常写入此表,但使用pragma writable_schema=on可以编写。做任何你想要的改变,然后关闭编译。最后,为了确保您不会因为在SQLite下更改架构而导致问题,请关闭数据库并重新打开它。