在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”。
相关文章