前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Flask(数据库操作 十一)

Flask(数据库操作 十一)

作者头像
zx钟
发布2020-07-30 15:17:02
3610
发布2020-07-30 15:17:02
举报
文章被收录于专栏:测试游记测试游记

查询

查询全部

代码语言:javascript
复制
users = User.query.all()

查询第一个

代码语言:javascript
复制
users = User.query.first()

通过主键获取

代码语言:javascript
复制
users = User.query.get(1)

多个主键

代码语言:javascript
复制
users = User.query.get((1,5))
users = User.query.get({"id":1,"project_id":3})

filter_by筛选

只能处理相等

代码语言:javascript
复制
admin = User.query.filter_by(username='admin').first()

filter筛选

代码语言:javascript
复制
User.query.filter(User.email.endswith("@qq.com")).all()
代码语言:javascript
复制
from sqlalchemy.sql.operators import ColumnOperators

支持的字段操作:ColumnOperators:/usr/local/lib/python3.7/site-packages/sqlalchemy/sql/operators.py.ColumnOperators

支持的操作

排序

代码语言:javascript
复制
User.query.order_by(User.username.desc()).all()

现在返回用户的数量

代码语言:javascript
复制
User.query.order_by(User.username.desc()).limit(1).all()

未找到

使用first_or_404没找到就用abort()和异常处理机制配合

删除

代码语言:javascript
复制
db.session.delete(me)
db.session.commit()

更新

代码语言:javascript
复制
user = User.query.get(1)
user.username = "abc"
db.session.add(user)
db.session.commit()

外键关联

多对一

例子:

多个学生 一个班级

写法1
代码语言:javascript
复制
class Project(db.Model):
    # __tablename__ = 'project'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    modules = db.relationship('Module', backref='module_project')


class Module(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'))
写法2
代码语言:javascript
复制
class Project(db.Model):
    # __tablename__ = 'project'
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    modules = db.relationship('Module', back_populates='module_project')  # 数据库中不会有新字段


class Module(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(80))
    project_id = db.Column(db.Integer, db.ForeignKey('project.id'))
    module_project = db.relationship('Project', back_populates='modules')

对应关系

backref vs back_populates
  • back_populates 需要双向显示说明;backref只需要指名一边隐式声明
  • back_populates 更麻烦;backref 更简单
  • back_populates 可读性强,可以表明各个表之间的关系

一对一

例子:

一个人一个身份证号

代码语言:javascript
复制
class Project(db.Model):
    modules = db.relationship("Module", back_populates='project', uselist=False)


class Module(db.Model):
    project = db.relationship("Module", back_populates='modules', uselist=False)

多对多

例子:

1个学生 多门课程 1门课程 多个学生

代码语言:javascript
复制
xuanke = db.Table('xuanke',
                  db.Column('user_id'),
                  db.Integer,
                  db.ForeignKey('user.id'),
                  db.Column('subject_id'),
                  db.Integer,
                  db.ForeignKey('subject.id')
                  )


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    subject = db.relationship('Subject', secondary=xuanke, backref=db.backref('users', lazy='dynamic'))


class Subject(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20))

插入数据

代码语言:javascript
复制
@app.route('/insert')
def insert():
    user1 = User(name='张三')
    user2 = User(name='李四')
    user3 = User(name='王五')

    subject1 = Subject(name='自动化测试')
    subject2 = Subject(name='测试开发')
    subject3 = Subject(name='Java')

    user1.subject.append(subject1)
    user1.subject.append(subject2)

    db.session.add_all([user1, user2, user3, subject1, subject2, subject3])
    db.session.commit()
    return 'OK'

查找数据

代码语言:javascript
复制
@app.route('/select')
def select():
    user = User.query.get(1)
    s = user.subject
    print(s)
    return 'OK'

自引用

代码语言:javascript
复制
class Follower(db.Model):
    # 粉丝ID
    fensi_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)
    # 关注者ID
    guanzhuzhe_id = db.Column(db.Integer, db.ForeignKey('user.id'), primary_key=True)


class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    name = db.Column(db.String(20), nullable=False)
    sujects = db.relationship('Xuanke', back_populates='student')
    fensis = db.relationship('Follower', foreign_keys=[Follower.guanzhuzhe_id], backref='guanzhuzhe')
    guanzhuzhes = db.relationship('Follower', foreign_keys=[Follower.fensi_id], backref='fensi')
本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-07-26,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 测试游记 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 查询
    • 查询全部
      • 查询第一个
        • 通过主键获取
          • filter_by筛选
            • filter筛选
              • 排序
                • 现在返回用户的数量
                  • 未找到
                  • 删除
                  • 更新
                  • 外键关联
                    • 多对一
                      • 写法1
                      • 写法2
                      • backref vs back_populates
                    • 一对一
                      • 多对多
                        • 自引用
                        领券
                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档