SQLAlchemy表关系

1.SQLAlchemy表关系

在MySQL中表关系有一对一、一对多和多对多,我们接下来通过SQLAlchemy实现上述表关系。

1.1.一对多

在MySQL中构建表与表之间的关系是通过设置外键来完成的,外键可以使得两张表关联,保证数据的一致性和实现一些级联操作。同样,我们需要通过SQLAlchemy设置外键来实现表关系。

现在我们在数据库中建立一张student表,表中有id字段(数值型、主键、自增),name字段(字符串类型)、age字段(字符串类型)、sex字段(枚举型,“男”和“女”);我们再建立一张score表,表中有num字段(表示序号、数值型、主键、自增)、name字段(字符型)、id(外键,对应student表中的id字段、数值型)、score字段(数值型)。student表中的一条记录可以对应score表中的多条记录。因此,父模型为student表,子模型为score表。

代码如下,

from sqlalchemy import create_engine, Column, String, Integer, Enum, ForeignKey  
# 注意要导入ForeignKey模块
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship  # 注意要导入relationship模块

HOSTNAME = '127.0.0.1'
PORT = '3306'
USERNAME = 'root'
PASSWORD = '******'
DATABASE = 'sqlalchemy'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)  # ?charset=utf8mb4表示设置字符集类型为utf8mb4

engine = create_engine(DB_URI)

Base = declarative_base(engine)

session = sessionmaker(engine)()


class Student(Base):
    __tablename__ = 'student'
    id = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(10))
    age = Column(Integer)
    sex = Column(Enum('男', '女'))

    def __repr__(self):
        return "Student(name:{}, age:{}, sex:{})".format(self.name, self.age, self.sex)


class Score(Base):
    __tablename__ = 'score'
    num = Column(Integer, primary_key=True, autoincrement=True)
    name = Column(String(10))
    id = Column(Integer, ForeignKey('student.id'))  
    # 设置外键,该外键对应student表id字段,一般格式为 表名.字段
    score = Column(Integer)

    student = relationship('Student', backref='score')
    # 设置relationship,第一个参数为指向的ORM模型,backref参数可以指定反向访问的属性名称

    def __repr__(self):
        return "Score(name:{}, id:{}, score:{})".format(self.name, self.id, self.score)


Base.metadata.drop_all()
Base.metadata.create_all()

注意,
1.mysql级别的外键,必须拿到一个表的外键,然后通过这个外键再去另外一张表中查找,这样太麻烦了。SQLAlchemy提供了一个relationship,这个类可以定义属性,以后在访问相关联的表的时候就直接可以通过属性访问的方式就可以访问得到了。
2.外键的字段,必须和父表的主键字段类型保持一致。

下面,我们向表中添加数据,

student1 = Student(name='zhao', age=22, sex='男')
student2 = Student(name='qian', age=20, sex='男')
student3 = Student(name='sun', age=23, sex='女')
student4 = Student(name='li', age=21, sex='男')

score1 = Score(name='zhao', score=87)
score2 = Score
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值