Sqlalchemy对MSSQL GETDATE()服务器默认不生成正确的SQL

2 投票
1 回答
980 浏览
提问于 2025-04-18 10:59

我有一个声明式的SQL类:

class Test(Base):
    ID = Column(Integer, primary_key=True)
    SYSTEM_TIMESTAMP = Column(DateTime, nullable=False, server_default='GETDATE()')

但是使用Base.metadata.create_all(engine)时,会生成以下SQL语句来处理SYSTEM_TIMESTAMP:

[SYSTEM_TIMESTAMP] DATETIME NOT NULL DEFAULT 'GETDATE()',

这是GETDATE应该生成的一个例子,详细信息可以查看这个链接

OrderDate datetime NOT NULL DEFAULT GETDATE()

我尝试用func.getdate替代'GETDATE()'作为服务器默认值,但出现了以下错误:

ArgumentError: Argument 'arg' is expected to be one of type '<type 'basestring'>' or
 '<class 'sqlalchemy.sql.expression.  ClauseElement'>' or
 '<class 'sqlalchemy.sql.expression.TextClause'>',
  got '<class 'sqlalchemy.sql.expression._FunctionGenerator'>'

SQLAlchemy版本:0.9.6
Pyodbc版本:3.0.5
Python版本:2.7

我该如何让SQLAlchemy生成正确的SQL语句来设置服务器默认值呢?

1 个回答

5

解决办法是使用 SQLAlchemy 的 text() 函数来定义服务器的默认值:

import sqlalchemy as sa
...
SYSTEM_TIMESTAMP = Column(DateTime, nullable=False, server_default=sa.text("GETDATE()"))

这样就能正确地设置服务器的默认值:

[SYSTEM_TIMESTAMP] DATETIME NOT NULL DEFAULT GETDATE(),

相关文档可以在这里找到: http://docs.sqlalchemy.org/en/latest/core/defaults.html#server-side-defaults

撰写回答