📅  最后修改于: 2023-12-03 15:05:19.605000             🧑  作者: Mango
SQLAlchemy是一个Python的ORM(Object-relational mapping)框架,它提供了一种ORM方式来操作关系数据库,使得开发者可以使用更加Pythonic的方式实现对数据库的操作。在ORM框架中,将Python对象与关系数据库中的表进行映射,从而将数据库表的操作转化为对Python对象的操作。
SQLAlchemy ORM通过面向对象的方式实现了关系数据库的操作,支持多种关系数据库,如SQLite、MySQL、PostgreSQL、Oracle、Microsoft SQL Server等。
在SQLAlchemy ORM中,通过定义类之间的关系来建立对象之间的关联,这些关系被称作ORM关系。ORM关系可以是一对一、一对多或多对多关系。
在一对一的关系中,一个实体只能对应另一个实体。
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
address = relationship("Address", uselist=False, back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="address")
这段代码定义了一个User类和一个Address类。User类和Address类通过一对一的关系进行关联。User类有一个Address属性,而Address类也有一个User属性。
其中,User类中的address属性表示Address类的实例,使用relationship函数来定义ORM关系。这里的参数uselist=False表示该属性只有一个元素,不是使用列表的方式来组织对象。back_populates参数表示Address类中的user属性,是User类中address属性的反向引用。
而Address类中的user属性也使用relationship函数来定义ORM关系。其中的参数User表示关联的模型类,而back_populates参数表示User类中的address属性,是Address类中user属性的反向引用。
在一对多关系中,一个实体可以对应多个实体。
from sqlalchemy import Column, ForeignKey, Integer, String
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
addresses = relationship("Address", back_populates="user")
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", back_populates="addresses")
这段代码定义了一个User类和一个Address类。User类和Address类通过一对多的关系进行关联。User类有一个addresses属性,而Address类也有一个user属性。
在这里,User类的addresses属性表示Address类的实例列表,使用relationship函数来定义ORM关系。back_populates参数表示Address类中的user属性,是User类中addresses属性的反向引用。
而Address类中的user属性也使用relationship函数来定义ORM关系。其中的参数User表示关联的模型类,而back_populates参数表示User类中的addresses属性,是Address类中user属性的反向引用。
在多对多关系中,一个实体可以对应多个实体,并且一个实体也可以被多个实体所关联。
from sqlalchemy import Column, Integer, String, Table, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
association_table = Table('association', Base.metadata,
Column('left_id', Integer, ForeignKey('left.id')),
Column('right_id', Integer, ForeignKey('right.id'))
)
class Left(Base):
__tablename__ = 'left'
id = Column(Integer, primary_key=True)
name = Column(String(50))
rights = relationship('Right', secondary=association_table, back_populates='lefts')
class Right(Base):
__tablename__ = 'right'
id = Column(Integer, primary_key=True)
name = Column(String(50))
lefts = relationship('Left', secondary=association_table, back_populates='rights')
这段代码定义了一个Left类和一个Right类。Left类和Right类通过多对多的关系进行关联。
在这里,使用了Table函数定义了一个名为association_table的表,该表用于存储Left类和Right类之间的关联关系。
Left类中的rights属性通过定义secondary参数将该属性与association_table进行关联,表示该属性中的元素对象是Right类。而back_populates参数表示Right类中的lefts属性,是Left类中rights属性的反向引用。
Right类中的lefts属性也通过定义secondary参数将该属性与association_table进行关联,表示该属性中的元素对象是Left类。而back_populates参数表示Left类中的rights属性,是Right类中lefts属性的反向引用。
通过以上的介绍,我们了解了在SQLAlchemy ORM中如何通过定义类之间的关系来建立对象之间的关联。了解了一对一、一对多、多对多关系的建立方法和相关参数的说明。在实际应用中,我们可以根据具体的场景选择合适的关系类型,以满足不同的业务需求。