我有以下声明性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] DATETIME NOT NULL DEFAULT 'GETDATE()',
如何从http://www.w3schools.com/sql/func_getdate.asp发出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来设置服务器默认值?
最佳答案
解决方案是使用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