gpt4 book ai didi

python - 具有连接列的 Flask SQLAlchemy 查询

转载 作者:太空宇宙 更新时间:2023-11-04 08:25:23 25 4
gpt4 key购买 nike

我有这样一个模型:

class User(db.Model):
id = db.Column(db.Integer, primary_key=True)
first_name = db.Column(db.String(64), index=True)
last_name = db.Column(db.String(64), index=True)

def full_name(self):
return '%s %s' % (self.first_name, self.last_name)

我想在查询中获取 full_name 方法,我试了一下:

user = db.session.query(User.full_name()).all()

但我收到此错误消息:

TypeError: full_name() missing 1 required positional argument: 'self'

然后我尝试调用不带括号的函数:

user = db.session.query(User.full_name).all()

然后我收到这个错误信息:

sqlalchemy.exc.InvalidRequestError: SQL expression, column, or mapped entity expected - got '<function User.full_name at 0x7f265960aae8>'

那么,在 User 模型中查询 full_name() 方法的正确方法是什么?

最佳答案

有多种方法可以实现这一点。首先,hybrid attribute ,在实例和类(用于查询)上定义 full_name 的属性。

这个例子是纯SQLAlchemy,但是混合属性在Flask-SQLAlchemy中应该是一样的。

import sqlalchemy as sa
from sqlalchemy.ext import hybrid

class User(Base):
__tablename__ = 'users'

id = sa.Column(sa.Integer, primary_key=True)
first_name = sa.Column(sa.String)
last_name = sa.Column(sa.String)

@hybrid.hybrid_property
def full_name(self):
return self.first_name + ' ' + self.last_name

users = session.query(User).filter_by(full_name='Joan Doe').all()

归功于 Ilja对于pointing out在这种情况下,这可以使用一种方法来完成。这是有效的,因为 SQLAlchemy 映射 + operator到数据库的 CONCAT 函数。如果不是这种情况,则需要使用 hybrid.expression 修饰的附加属性来实现类级别的行为。

SQLAlchemy 会根据需要在 SQL 语句中插入必要的表达式,例如:

SELECT users.id, users.first_name, users.last_name 
FROM users
WHERE users.first_name || ? || users.last_name = ?

实现此目的的另一种方法是定义一个 column_property :

from sqlalchemy import orm

class User(Base):
...
full_name = orm.column_property(first_name + " " + last_name)

这会将一个表达式插入到模型的所有查询中,所以

query = sa.select(User)

将生成此 SQL:

SELECT users.first_name || ? || users.last_name AS anon_1,
users.id,
users.first_name,
users.last_name
FROM users

最后还有computed columns .这些在概念上类似于列属性,但在数据库端实现(前提是数据库支持所需的语法)。数据库可能会或可能不会物理存储计算值;可以通过将 persisted bool 关键字参数传递给 Computed 来调节此行为。

class User(Base):
...
full_name = sa.Column(sa.String, sa.Computed(first_name + ' ' + last_name))

关于python - 具有连接列的 Flask SQLAlchemy 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57842652/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com