在SQLAlchemy中处理关联关系

2023-04-05 00:00:00 sqlalchemy 关联关系

在SQLAlchemy中处理关联关系,需要使用ORM(Object-Relational Mapping)机制。ORM机制将数据库表格映射成对象,可以通过对象的属性和方法来访问数据库,避免了直接操作数据库的复杂性。

使用ORM机制处理关联关系,需要定义两个表格之间的关系,一般有一对多、多对一、一对一、多对多四种类型的关系。

下面以一对多关系为例进行演示,假设有两个表格,一个是“公司表格”,另一个是“员工表格”。每个公司可以有多个员工,而每个员工只能属于一个公司。

首先,需要定义两个类,分别对应两个表格:

from sqlalchemy import Column, Integer, String, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Company(Base):
    __tablename__ = 'company'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    employees = relationship("Employee", back_populates="company")

class Employee(Base):
    __tablename__ = 'employee'

    id = Column(Integer, primary_key=True)
    name = Column(String)
    company_id = Column(Integer, ForeignKey('company.id'))
    company = relationship("Company", back_populates="employees")

在Company类中,使用relationship函数定义了一个employees属性,表示当前公司有多个员工,同时设置了back_populates属性,表示员工类中也有一个属性指向当前公司。在Employee类中,同样使用relationship函数定义了一个company属性,表示当前员工属于哪个公司,同时也设置了back_populates属性,表示公司类中也有一个属性指向当前员工。

这样定义之后,就可以进行一些操作了。假设现在要创建一个公司,并添加两个员工:

from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('sqlite:///:memory:', echo=True)
Session = sessionmaker(bind=engine)
session = Session()

Base.metadata.create_all(engine)

company = Company(name='pidancode.com')
employee1 = Employee(name='Peter')
employee2 = Employee(name='John')
company.employees.append(employee1)
company.employees.append(employee2)

session.add(company)
session.commit()

首先创建了一个数据库引擎和一个Session,然后调用create_all函数创建表格。接着创建一个公司实例和两个员工实例,并将员工添加到公司的employees属性中。最后使用session的add和commit函数将公司和员工添加到数据库中。

查询操作也很简单,可以通过一个实例的关系属性来访问相关联的实例:

company = session.query(Company).filter_by(name='pidancode.com').one()
print(company.employees[0].name)

这样就可以得到第一个员工的姓名“Peter”。

相关文章