一、一对多关系
爱好和人的关系,一个爱好可以对应多个人
1、models
# 1 导入一些模块 import datetime from sqlalchemy import create_engine from sqlalchemy.orm import declarative_base, \relationship # 新的变成它,老的会有 from sqlalchemy.ext.declarative import declarative_base Warningfrom sqlalchemy import Column, Integer, String, Text, ForeignKey, DateTime, UniqueConstraint, Index# 2 得到所有表模型需要继承 基类 Base = declarative_base()class Hobby(Base):__tablename__ = 'hobby'id = Column(Integer, primary_key=True)caption = Column(String(50), default='篮球')def __str__(self):return self.captionclass Person(Base):__tablename__ = 'person'id = Column(Integer, primary_key=True)name = Column(String(32), index=True, nullable=True)# hobby指的是tablename而不是类名,uselist=Falsehobby_id = Column(Integer, ForeignKey("hobby.id")) # 关联字段写在多的一方# 跟数据库无关,不会新增字段,只用于快速链表操作# 类名,backref用于反向查询hobby = relationship('Hobby', backref='pers') # 等同于django中的relate_name,反向查询替换表名小写的def __str__(self):return self.namedef __repr__(self):return self.name
补充:
1.1 __str__
和 __repr__ 方法
__str__
作用:
-
__str__
方法用于定义对象的“用户友好”字符串表示形式。 -
当你使用
print(obj)
或str(obj)
时,Python 会调用__str__
方法来获取对象的字符串表示。 -
这个方法通常用于向用户展示对象的描述性信息。
user = Users(name="Alice") print(user) # 输出: Alice
__repr__
作用:
-
__repr__
方法用于定义对象的“开发者友好”字符串表示形式。 -
当你直接在交互式环境中输入对象名称(如
obj
)或使用repr(obj)
时,Python 会调用__repr__
方法。 -
这个方法通常用于调试和开发,返回的字符串应该尽可能明确地描述对象的状态。
-
如果
__str__
方法未定义,__repr__
会作为__str__
的备用方法。
def __repr__(self):return f"<User(id={self.id}, name={self.name}, email={self.email})>"
1.2、 relationship
hobby = relationship('Hobby', backref='pers')
-
'Hobby'
:-
指定关联的模型类为
Hobby
。
-
-
backref='pers'
:-
在
Hobby
模型中创建一个pers
属性,用于反向查询与该Hobby
关联的所有Person
对象。 -
例如,可以通过
hobby.pers
获取所有喜欢该Hobby
的Person
对象。
-
正向查询
通过 Person
对象访问关联的 Hobby
对象:
person = session.query(Person).all() print(person[1].name) print(person[1].hobby)## 结果 dapeng 乒乓球
反向查询
通过 Hobby
对象访问关联的 Person
对象:
hobby = session.query(Hobby).all() print(hobby[1].pers) # 获取所有喜欢该 Hobby 的 Person 对象