如何使用 SQLAlchemy 选择 PostgreSQL 系统列?

2024-04-19

Postgresql 在每个表上隐式定义了几个列,例如xmax and ctid (see docs https://www.postgresql.org/docs/current/ddl-system-columns.html).

假设我的 SQLALchemy 表定义没有指定这些列,有没有办法使用核心 sql 功能(即不是 SA 的 ORM 部分)来选择它们?

以下内容不起作用xmax没有在表定义中明确定义。

table = sa.Table(
    "mytable",
    metadata,
    sa.Column("col_a", sa.BIGINT),
    sa.Column("date", sa.DATE),
)

s = sa.select([table.c.xmax])
result = engine.execute(s)

具体我的要求是参考xmax in the returningupsert 的子句。

insert(mytable).returning((mytable.c.xmax == 0).label("inserted"))

如果您不想更改现有的表声明,可以使用sqlalchemy.column() https://docs.sqlalchemy.org/en/13/core/sqlelement.html?highlight=column#sqlalchemy.sql.expression.column函数(注意小写c in column):

xmax = sa.column('xmax')
sa.insert(mytable).returning((xmax == 0).label("inserted"))

然而,如果你的 SQL 语句从多个表中选择(例如在一个连接中),那么 PostgreSQL 会抱怨它不知道哪个表xmax您正在谈论的专栏:

ProgrammingError: (psycopg2.ProgrammingError) column "xmax" does not exist

在这种情况下,您可以使用(不幸的是没有记录)_selectable范围:

xmax = sa.column('xmax', _selectable=mytable)
sa.insert(mytable).returning((xmax == 0).label("inserted"))

它在连接表查询中以及仅从一个表中进行选择的情况下都有效,因此您可以根据需要随时使用它。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 SQLAlchemy 选择 PostgreSQL 系统列? 的相关文章

随机推荐