【问题标题】:SQLAlchemy set default value for postgres JSON columnSQLAlchemy 为 postgres JSON 列设置默认值
【发布时间】:2016-12-22 00:45:27
【问题描述】:

我想将我的 SQLAlchemy postgres JSON 列的默认值设置为一个空字典。

from sqlalchemy.dialects.postgresql import JSON

info = Column(JSON, default='{}')
info = Column(JSON, default={})

这些都不起作用。

【问题讨论】:

  • 这可能是因为同一个dict 实例正在您模型的所有 个实例中使用。试试default=lambda: {}
  • 感谢 univerio 有效。您可以提交答案,如果您愿意,我可以接受。否则我会写我自己的答案。

标签: python json postgresql sqlalchemy


【解决方案1】:

使用 default=lambda: {} 有效。归功于 cmets 中的 univerio。

【讨论】:

  • 更干净简洁的解决方案,改用吧。
  • 这似乎不再有效,您是否使用相同的解决方案?
  • @Konrad 是的,我有。也许新版本的 SQLAlchemy 打破了这一点
  • 好像:'(
  • 我使用default=dict,它在功能上等同于 lambda。这仍然适用于我使用 SQLAlchemy 1.3.x
【解决方案2】:

我发现使用默认 {} 值定义 JSON 非空(如果适用)列的最简单方法是(使用 SQLAlchemy 1.3.x 测试):

info = db.Column(JSON, nullable=False, server_default='{}')

【讨论】:

  • 我没有使用default,只使用了server_default='{}'
【解决方案3】:

如果有人像我一样将defaultserver_defaultJSONB-column 结合使用,那么似乎可行的方法如下:

from sqlalchemy import text

info = Column(JSONB, default=text("'{}'::jsonb"), server_default=text("'{}'::jsonb"))

上述方法(default=dictdefault=lambda: {})对我没有工作。特别是与alembic结合使用。我总是得到错误:
sqlalchemy.exc.ArgumentError: Argument 'arg' is expected to be one of type '<class 'str'>' or '<class 'sqlalchemy.sql.elements.ClauseElement'>' or '<class 'sqlalchemy.sql.elements.TextClause'>', got '<class 'type'>'(或 function 而不是 type 用于 lambda)。

【讨论】:

  • 在 alembic 迁移脚本中指定 default 毫无意义 - alembic 从不执行 INSERTs 或 UPDATEs,而 default 仅在列 没有值时使用在 INSERTUPDATE。请参阅:docs.sqlalchemy.org/en/14/core/defaults.html。根据经验,您应该在迁移脚本中仅使用产生 DDL 的 SQLA 结构(如表、列)。
  • 感谢您的澄清。答案主要是在 Python 模块中使用它,使用 SQLAlchemy 作为 ORM,我遇到了问题(
  • 仅供参考,defaultserver_default 都可以,我也不需要添加 ::jsonb。对于具有非空默认值的任何人,这是一个示例:privileges = db.Column(JSONB, nullable=False, default=text(f"'{json.dumps(default_privileges)}'")) - 其中default_privileges 是为此目的定义的任何dict
【解决方案4】:

最好只使用dict 构造函数:

info = Column(JSON, default=dict)

另外,也适用于其他类型:

created = Column(DateTime, default=datetime.utcnow)

【讨论】:

猜你喜欢
  • 2013-11-11
  • 1970-01-01
  • 2016-08-03
  • 1970-01-01
  • 2014-03-02
  • 2019-06-21
  • 2011-12-01
  • 2020-07-24
  • 2011-08-29
相关资源
最近更新 更多