0

我是 sqlalchemy 的新手。我可以通过这样的声明性映射创建数据库表:

engine = create_engine("--engine works---")

Base = declarative_base()

class Customer(Base):
    __tablename__ = 'customer'

    customer_id = Column(Integer, primary_key=True)
    name = Column(String(30))
    email = Column(String(30))

    invoices = relationship(
        'Invoice',
        order_by="Invoice.inv_id",
        back_populates='customer',
        cascade="all, delete, delete-orphan"
    )


class Invoice(Base):
    __tablename__ = 'invoice'

    inv_id = Column(Integer, primary_key=True)
    name = Column(String(30))
    created = Column(Date)

    customer_id = Column(ForeignKey('customer.customer_id'))

    customer = relationship('Customer', back_populates='invoices')

Base.metadata.create_all(engine)

这可以。我在customerinvoice表中都添加了一些数据。

到目前为止,一切都很好。接下来,我会automap_base在这个现有的数据库上尝试这样的:

from sqlalchemy import select, text
from sqlalchemy.orm import declarative_base, sessionmaker
from sqlalchemy.ext.automap import automap_base


engine = create_engine('--engine works---')
Base = automap_base()
# reflect
Base.prepare(engine, reflect=True)

Customer = Base.classes.customer
Invoice = Base.classes.invoice

Session = sessionmaker(bind=engine, future=True)
session = Session()

# query invoice
stmt = select(Customer, Invoice).join(Customer.invoices).order_by(Customer.customer_id, Invoice.inv_id)
res = session.execute(stmt)

for c in res:
    print(c.customer_id)

当我运行代码时,我得到:

AttributeError: type object 'customer' has no attribute 'invoices'

在这种情况下,我错过了Customer(一方面)或Invoice(多方面)的关系,以便当我查询具有发票属性的客户和具有客户属性的发票时?谢谢你的帮助。

4

1 回答 1

1

默认情况下,automap 将通过在小写类名后附加“_collection”来在父级中创建关系,因此名称将为Customer.invoice_collection.

在回答这个问题时,我发现除非我事先执行查询,否则连接会引发AttributeErroron ,例如Customer.invoice_collectionCustomer

session.execute(sa.select(Customer).where(False))

我不确定为什么会发生这种情况,但是您不一定需要加入,因为您可以Customer.invoice_collection直接迭代或加入发票表:

stmt = sa.select(Customer, Invoice).join(Invoice)
res = session.execute(stmt)
for c, i in res:
    print(c.customer_id, i.inv_id)
于 2022-02-12T11:10:14.837 回答