python - 来自连接的 SQLAlchemy 声明属性(单个属性,而不是整个对象)

标签 python orm sqlalchemy declarative

我希望创建一个从另一个表填充的对象的映射属性。

使用 SQLAlchemy 文档示例,我希望在 Address 类中创建一个 user_name 字段,以便可以轻松查询和访问它(无需第二次往返数据库)

例如,我希望能够通过user_name Address.query.filter(Address.user_name == 'wcdolphin').first() 进行查询和过滤 并且还可以访问所有地址对象的 user_name 属性,而不会降低性能,并像 __tablename__

中的属性一样正确地持久化写入
class User(Base):
    __tablename__ = 'users'

    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    addresses = relation("Address", backref="user")

class Address(Base):
    __tablename__ = 'addresses'

    id = Column(Integer, primary_key=True)
    email = Column(String(50))
    user_name = Column(Integer, ForeignKey('users.name'))#This line is wrong

我该怎么做?

我发现文档相对难以理解,因为它似乎不符合大多数示例,尤其是 Flask-SQLAlchemy 示例。

最佳答案

您可以在查询对象上使用 join 来完成此操作,无需直接指定此属性。所以你的模型看起来像:

from sqlalchemy import create_engine, Column, Integer, String, ForeignKey
from sqlalchemy.orm import sessionmaker, relation
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()
engine = create_engine('sqlite:///')
Session = sessionmaker(bind=engine)

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, primary_key=True)
    name = Column(String(50))
    addresses = relation("Address", backref="user")

class Address(Base):
    __tablename__ = 'addresses'
    id = Column(Integer, primary_key=True)
    email = Column(String(50))
    user_id = Column(Integer, ForeignKey("users.id"))


Base.metadata.create_all(engine)

地址后过滤用户名的查询如下所示:

>>> session = Session()
>>> session.add(Address(user=User(name='test')))
>>> session.query(Address).join(User).filter(User.name == 'test').first()
<__main__.Address object at 0x02DB3730>

编辑:由于您可以直接从地址对象访问用户,因此无需直接将属性引用到地址类:

>>> a = session.query(Address).join(User).filter(User.name == 'test').first()
>>> a.user.name
'test'

关于python - 来自连接的 SQLAlchemy 声明属性(单个属性,而不是整个对象),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10891552/

相关文章:

python - Discord 机器人检查用户是否是管理员

python - aiohttp - 异常忽略消息

python - yield 如何在 Python C 代码中工作,好的和坏的部分

java - JPA:如何将实体与关系属性关联起来?

xml - JPA 对 XML 数据类型列的支持

sqlalchemy 按日期列仅选择 x newset 天

python - 如何在 tkinter 中用箭头连接两个状态圆圈?

json - 如何使用 JPA 和 Hibernate 自动序列化和反序列化 JSON 字符串?

python - sqlalchemy 和 SQLite 共享缓存

python - SQLAlchemy 的正确模型定义是什么以避免错误消息 : AttributeError: 'InstrumentedList' object has no attribute'?