使用SQLAlchemy选择具有强制转换的特定列



我正在使用SQLAlchemy (Version: 1.4.44),当我尝试选择列并对这些列使用强制转换时,我有一些意想不到的结果。

首先,大多数示例,甚至当前的文档都建议通过将数组传递给select函数来进行列选择,如下所示:
s = select([table.c.col1])

但是,如果我尝试这个,我得到以下错误:

s = my_table.select([my_table.columns.user_id])
sqlalchemy.exc.ArgumentError: SQL expression for WHERE/HAVING role expected, got [Column('user_id', String(), table=<my_table>)].

一些示例建议直接将字段放在select查询中。

s = select(table.c.col1)

但是这似乎只是在字段外创建了一个空闲的where子句。

我最终能够用这种方法实现列选择:

s = my_table.select().with_only_columns(my_table.columns.created_at)

但是由于某种原因,我不能在这种方法中使用强制转换。

s = my_table.select().with_only_columns(cast(my_table.columns.created_at, Date))
ValueError: Couldn't parse date string '2022' - value is not a string.

感谢所有的帮助!

我不认为table.select()是常用的用法。SQLAlchemy目前正在向2.0迈进。在1.4(和2)中,以下语法应该可以工作,使用您已经工作的任何会话处理,我指的是select(...):

from sqlalchemy.sql import select, cast
from sqlalchemy.dialects.postgresql import INTEGER
class User(Base):
__tablename__ = "users"
id = Column(
Integer, nullable=False, primary_key=True
)
name = Column(Text)
with Session(engine) as session:
u1 = User(name="1")
session.add(u1)
session.commit()
with Session(engine) as session:
my_table = User.__table__
# Cast user name into integer.
print (session.execute(select(cast(my_table.c.name, INTEGER))).all())

最新更新