Sqlalchemy不会为MSSQL GETDATE()服务器默认发出正确的SQL

rac*_*mir 2 python sql-server sqlalchemy

我有以下声明性SQL类:

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

但是使用Base.metadata.create_all(engine)会导致为SYSTEM_TIMESTAMP发出以下SQL:

[SYSTEM_TIMESTAMP] DATETIME NOT NULL DEFAULT 'GETDATE()',
Run Code Online (Sandbox Code Playgroud)

有关如何从http://www.w3schools.com/sql/func_getdate.asp发出GETDATE的示例:

OrderDate datetime NOT NULL DEFAULT GETDATE()
Run Code Online (Sandbox Code Playgroud)

我尝试使用func.getdate而不是'GETDATE()'作为server_default,但是得到以下错误:

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'>'
Run Code Online (Sandbox Code Playgroud)

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

如何让SQLAlchemy发出以纠正SQL以设置服务器默认值?

rac*_*mir 5

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

import sqlalchemy as sa
...
SYSTEM_TIMESTAMP = Column(DateTime, nullable=False, server_default=sa.text("GETDATE()"))
Run Code Online (Sandbox Code Playgroud)

这将正确地发出服务器默认值:

[SYSTEM_TIMESTAMP] DATETIME NOT NULL DEFAULT GETDATE(),
Run Code Online (Sandbox Code Playgroud)

这在此处记录:http://docs.sqlalchemy.org/en/latest/core/defaults.html#server-side-defaults