SqlAlchemy:insert语句、实际SQL和跳过字段

2024-03-28 13:04:23 发布

您现在位置:Python中文网/ 问答频道 /正文

我有以下SqlAlchemy模型:

class SchemaVersion(Base):
    __tablename__ = 'schema_version'

    timestamp = Column(DateTime, default=datetime.datetime.utcnow, primary_key=True)
    version   = Column(String)
    notes     = Column(String)

最接近我的是:

statement = insert(SchemaVersion).values(version='v1.0.0',
                                         notes='Initial schema')

print(statement.compile(engine, compile_kwargs={'literal_binds': True}))

engine是我使用的引擎(Postgres)

结果是:

INSERT INTO schema_version (timestamp, version, notes) VALUES (%(timestamp)s, 'v1.0.0', 'Initial schema')

问题当然是%(timestamp)s

如何将now()作为值传递,或者让SqlAlchemy为我使用默认值?如果我尝试:

statement = insert(SchemaVersion).values(timestamp=datetime.datetime.utcnow(),
                                         version='v1.0.0',
                                         notes='Initial schema')

我得到一个错误:

NotImplementedError: Don't know how to literal-quote value datetime.datetime(2018, 8, 21, 9, 50, 11, 732957)

Tags: truedatetimestringsqlalchemyversionschemacolumntimestamp
1条回答
网友
1楼 · 发布于 2024-03-28 13:04:23

虽然不太清楚为什么您对生成带有绑定文本的SQL字符串感兴趣,但是您可以通过在数据库中使用例如CURRENT_TIMESTAMP生成时间戳来避免only simple types such as ^{} and ^{} are supported

statement = insert(SchemaVersion).values(timestamp=func.current_timestamp(),
                                         version='v1.0.0',
                                         notes='Initial schema')

这将按照

INSERT INTO schema_version (timestamp, version, notes)
VALUES (CURRENT_TIMESTAMP, 'v1.0.0', 'Initial schema')

相关问题 更多 >