如何使用 SQLAlchemy 将列默认设置为 PostgreSQL 函数?

Posted

技术标签:

【中文标题】如何使用 SQLAlchemy 将列默认设置为 PostgreSQL 函数?【英文标题】:How to set a column default to a PostgreSQL function using SQLAlchemy? 【发布时间】:2013-12-30 05:11:56 【问题描述】:

我在 SQLAlchemy 中定义的所有表都有一个 UUID 类型的 id 列。

from sqlalchemy.ext.declarative import declarative_base
from uuid import uuid4
Base = declarative_base()

class MyTable(Base):
    id = Column(UUIDtype, default=uuid4, primary_key=True)

其中UUIDtype 是 PostgreSQL UUID 类型的特殊列类型。这成功地在 PostgreSQL 中创建了 UUID 列,但仅在使用 SQLAlchemy 插入时生成默认 UUID 值。这对于我的一些用例来说很好,但我想在 PostgreSQL 方面分配列的默认值,以防在 SQLAlchemy 之外发生插入。

以下 SQL 命令将正确的默认值放在列上:

ALTER TABLE my_table ALTER COLUMN id SET DEFAULT uuid_generate_v4()

如何通过 SQLAlchemy 模型定义将此 uuid_generate_v4() 函数指定为列默认值?如果唯一的选择是通过执行原始 SQL 语句,我有没有办法将该语句的执行挂钩到表创建过程中?

【问题讨论】:

【参考方案1】:

您应该为此使用server_default 参数。

id = Column(UUIDtype, server_default=text("uuid_generate_v4()"), primary_key=True)

更多信息请参见Server Side Defaults。

【讨论】:

create extension uuid-ossp安装uuid-ossp模块 或者使用gen_random_uuid()而不是uuid_generate_v4()并安装pgcryptocreate extension pgcrypto gen_random_uuid() 现在是 PostgreSQL 本地版本 13 的一部分,因此不需要模块。 postgresql.org/docs/13/functions-uuid.html

以上是关于如何使用 SQLAlchemy 将列默认设置为 PostgreSQL 函数?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Silverlight 中使用 Telerik RadGridView 将列设置为默认排序列

如何将列的默认值设置为今天的日期? [复制]

如何将sqlalchemy中列的默认值设置为关系中列的值?

如何根据 SqlAlchemy 关系设置模型默认值?

我可以将列的默认值设置为同一表中同一行上另一列的字符串吗?

SQLAlchemy docs(设置列默认值) - 这行语法有效的python如何? [关闭]