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 returning
upsert 的子句。
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(使用前将#替换为@)