SQLAlchemy教程

SQLAlchemy 建立关系

本次会议描述了另一个与我们数据库中现有表相关的表的创建。客户表包含客户的主数据。我们现在需要创建发票表,其中可能包含任意数量的属于客户的发票。这是一对多关系的情况。
使用声明式,我们定义这个表及其映射类,发票如下所示-
from sqlalchemy import create_engine, ForeignKey, Column, Integer, String
engine = create_engine('sqlite:///sales.db', echo = true)
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy.orm import relationship
class Customer(Base):
   __tablename__ = 'customers'
   id = Column(Integer, primary_key = true)
   name = Column(String)
   address = Column(String)
   email = Column(String)
class Invoice(Base):
   __tablename__ = 'invoices'
   
   id = Column(Integer, primary_key = true)
   custid = Column(Integer, ForeignKey('customers.id'))
   invno = Column(Integer)
   amount = Column(Integer)
   customer = relationship("Customer", back_populates = "invoices")
Customer.invoices = relationship("Invoice", order_by = Invoice.id, back_populates = "customer")
Base.metadata.create_all(engine)
这将向 SQLite 引擎发送一个 CREATE TABLE 查询,如下所示-
CREATE TABLE invoices (
   id INTEGER NOT null,
   custid INTEGER,
   invno INTEGER,
   amount INTEGER,
   PRIMARY KEY (id),
   FOREIGN KEY(custid) REFERENCES customers (id)
)
我们可以借助 SQLiteStudio 工具检查 sales.db 中是否创建了新表。
Sales.db 新表
Invoices 类在 custid 属性上应用 ForeignKey 构造。该指令指示该列中的值应限制为客户表的 id 列中存在的值。这是关系型数据库的核心特性,是将无连接的表集合转化为丰富的重叠关系的"粘合剂"。
第二个指令,称为relationship(),告诉ORM Invoice 类应该使用属性Invoice.customer 链接到Customer 类。 relationship() 使用两个表之间的外键关系来确定这种链接的性质,确定它是多对一的。
附加的relationship() 指令放置在Customer.invoices 属性下的Customer 映射类上。参数relationship.back_populates 被分配来引用互补的属性名称,以便每个relationship() 可以对反向表达的相同关系做出智能决策。一方面,Invoices.customer 指的是 Invoices 实例,另一方面,Customer.invoices 指的是一系列 Customer 实例。
关系函数是 SQLAlchemy ORM 包的关系 API 的一部分。它提供了两个映射类之间的关系。这对应于父子或关联表关系。
以下是发现的基本关系模式-

一对多

一对多关系在子表上的外键的帮助下引用父级。然后在父级上指定关系(),作为引用由子级表示的项目集合。 relationship.back_populates 参数用于建立一对多的双向关系,其中"反向"侧是多对一。

多对一

另一方面,多对一关系在父表中放置一个外键来引用子表。关系()在父级上声明,其中将创建一个新的标量保持属性。在这里,relationship.back_populates 参数再次用于双向行为。

一对一

一对一关系本质上是一种双向关系。 uselist 标志指示在关系的"多"端放置标量属性而不是集合。要将一对多转换为一对一类型的关系,请将 uselist 参数设置为 false。

多对多

多对多关系是通过添加与两个类相关的关联表来建立的,通过定义具有外键的属性。它由relationship() 的第二个参数指示。通常,Table 使用与声明性基类关联的 MetaData 对象,以便 ForeignKey 指令可以定位要链接的远程表。每个relationship() 的relationship.back_populates 参数建立双向关系。关系的双方都包含一个集合。
昵称: 邮箱:
Copyright © 2022 立地货 All Rights Reserved.
备案号:京ICP备14037608号-4