SQLalchemy relationship之lazy属性 学习笔记

relationship里面的lazy属性看得头昏脑涨,还是自己来动手弄点数据熟悉一下


模型还是建立在目前在看的Flask Web这本书上面的数据库,方便测试


第一步,建立一对多关系的测试,class是一这一端,对应student是多那一端,意思是,同一个课程,可以有很多学生选这门课

class Student(db.Model):
    __tablename__ = 'students'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(64))
    class_id = db.Column(db.Integer, db.ForeignKey('classes.id'))
    def __repr__(self):
        return '<Student: %r>' %self.name

class Class(db.Model):
    __tablename__ = 'classes'
    id = db.Column(db.Integer, primary_key=True)
    students = db.relationship('Student', backref='_class', lazy="select")
    name = db.Column(db.String(64))
    def __repr__(self):
        return '<Class: %r>' %self.name
注意Class里面的students是relationship,里面的lazy我选择了select,也就是默认值


手动插入数据进数据库,注意Allen和Tina选择的是同一门课,class1.

import sqlite3

conn = sqlite3.connect("e:\\flasky1\data-dev.sqlite")

cur = conn.cursor()

cur.execute("insert into students values(1,'Allen',1)")
cur.execute("insert into students values(2,'Bob',2)")
cur.execute("insert into students values(3,'Tina',1)")

cur.execute("insert into classes values(1,'class1')")
cur.execute("insert into classes values(2,'class2')")

cur.close()
conn.commit()
conn.close()

用c1代表第一门课程,class1,然后通过他的students属性,可以看到有多少学生选了这门课

可以看到,当Class的lazy属性是select的时候,他就是直接查找出了对象,并由对象为元素组成了一个list

然后,用s1这个实例对象,通过Class里面的backref=_class属性,也能访问Class内容,因为backref=_class默认也是select属性,所以,他也是直接导出结果




下面我改成<

SQLAlchemy中的relationship是用来定义数据库表之间的关系的工具。它允许我们在对象模型中表示实体之间的关联,例如一对多、多对一和多对多关系。 通过relationship,我们可以在模型类中定义一个属性,用于表示两个表之间的关系。这个属性可以在查询时被使用,从而方便地获取相关联的数据。 在使用relationship之前,需要导入`relationship`和`backref`这两个类或函数。 下面是一个例子,展示了如何在SQLAlchemy中使用relationship: ```python from sqlalchemy import Column, Integer, String, ForeignKey from sqlalchemy.orm import relationship, backref from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, primary_key=True) name = Column(String) posts = relationship('Post', backref='user') class Post(Base): __tablename__ = 'posts' id = Column(Integer, primary_key=True) title = Column(String) user_id = Column(Integer, ForeignKey('users.id')) # 创建数据库引擎和会话 engine = create_engine('sqlite:///database.db') Session = sessionmaker(bind=engine) session = Session() # 创建表格 Base.metadata.create_all(engine) # 创建用户和帖子实例 user = User(name='John') post = Post(title='Hello World') # 建立关系 user.posts.append(post) # 提交到数据库 session.add(user) session.commit() # 查询数据 user = session.query(User).first() print(user.posts) # 输出与该用户关联的所有帖子 ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值