• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

三.Flask 数据库[flask-sqlalchemy]

武飞扬头像
黑日里不灭的light
帮助1

一.数据库

1.基础

1.1 下载

格式:pip install flask-sqlalchemy

1.2 集成化配置

app.config['SQLALCHEMY_DATABASE_URI']='mysql://root:root@127.0.0.1/jack'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

学新通
特殊:引入mysql需要import pymysql; pymysql.install_as_MySQLdb()

1.3实例化

db =SQLAlchemy(app)
class Node(db.Model):
    __tablename__ = 'lu' #表单的名字
    id = db.Column(db.Integer, primary_key=True)
    body = db.Column(db.String(64), unique=True)

学新通
学新通

1.4注意

关闭:每次请求后都要有db.session.close()

最大并发量:这个跟数据库本身也有很大联系

    SQLALCHEMY_ENGINE_OPTIONS = {
        "pool_size": 3000, #该属性就是最大并发量
    }

丢弃:控制池达到其最大大小后可以创建的连接数。当这些额外的连接返回到池中时,它们将被断开并丢弃

    SQLALCHEMY_ENGINE_OPTIONS = {
        "max_overflow": 0,
    }

2.数据库操作

2.1 创建表单

格式:db.create_all()

2.2 添加内容

格式:

  1. content=Node(body='d')
  2. db.session.add(content)
  3. db.session.commit()
  4. db.session.close()

2.3 读取内容

格式:模型.query.过滤方法.查询方法

2.3.1 过滤方法

学新通
具体:

  1. == Node.query.filter(Node.id == 10).all()[0].body
  2. like
a = Node.query.filter(Node.body.like('S4354%')).all()
for i in a:
    print(i.body)
  1. in a = Node.query.filter(Node.id.in_([1,2])).all() #反馈回来id=1和id=2的不整条数据
  2. not in a = Node.query.filter(~Node.id.in_([1,2])).all()
  3. and from sqlalchemy import and_;a = Node.query.filter(and_(Node.id==1,Node.body =='51')).all() #and并列两个条件都成立返回一条结果(简单的可以用逗号分割)
  4. or from sqlalchemy import or_;a = Node.query.filter(or_(Node.id==1,Node.body =='51')).all()
2.3.2 查询方法

学新通

2.3.3 分页查询

解释:每次从数据库里提取几个
格式:Wenzhang.query.paginate(3,10).items #items是必须的不写看不到数据,此段代码表示第3页的10个内容

2.3.4 分类获取

解释:指定一个属性根据此排序获取内容
格式:Wenzhang.query.order_by("time").paginate(1,10).items #以时间为顺序获取此为升序;order_by(desc(Usser_ID))此为降序
注意:from sqlalchemy import desc

2.3.5 获取表单数目

格式:Wenzhang.query.count()

2.4 更改内容

格式:

node = Node.query.filter(Node.id == 5).first()
node.body='dbdbdbd'
db.session.commit()
db.session.close()

解释:直接通过获取;然后修改提交即可

2.5 删除内容

node = Node.query.filter(Node.id == 5).first()
db.session.delete(node)
db.session.commit()
db.session.close()

解释:直接通过获取;然后删除提交即可

3.数据库关联操作

3.1 一对多

原理:其实就是表单之间的关联,比如:作者为一个表单(属于一[指的是对应该表一条记录]),一个文章表单(属于多[多指的是对应该表多条记录])。一对多,就是说通过作者表单直接访问到文章表单的内容,关键就是在这两个表设置相同的的内容,通过相同的内容进行访问。

注意:外键必须指向对应的主键

创建:

class Author(db.Model):
        __tablename__ = 'author'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(30))
        article = db.relationship('Article', backref='article_look')

class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(30))
        text  = db.Column(db.Text)
        article_id = db.Column(db.Integer, db.ForeignKey('author.id'))# 作为键名,这里面的键名数据跟author.id想对应


db.create_all()

添加:

# 添加
content = Author(name ='jack')
db.session.add(content)
db.session.commit()
content1 = Author(name ='luck')
db.session.add(content1)
db.session.commit()
for i in range(0,10):
        content2 = Article(title=f'ti{i}', text=f'daaaaaaaaaaaaa{i}',article_id=1)
        db.session.add(content2)
        db.session.commit()
        if i >=7:
            content3 = Article(title=f'ti{i}', text=f'daaaaaaaaaaaaa{i}', article_id=2)
            db.session.add(content3)
            db.session.commit()

跨表查询(一查多):

print(Author.query.filter(Author.id == 1).first().article[0].text)
print(Author.query.filter(Author.id == 2).first().article[0].text)
# daaaaaaaaaaaaa0
# daaaaaaaaaaaaa7
# 原理:通过指定relationship的值可以访问到article全表

跨表查询(多查一):

print(Article.query.filter(Article.article_id == 1).first().article_look.name)
print(Article.query.filter(Article.article_id == 2).first().article_look.name)
#jack
#luck
#原理:通过backref关系函数,在author的另一侧(article一侧),用该参数反查

学新通
报错注意:ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails
可能原因:例如stuent表(主表)的id与class表的s_id字段设置外键关联, 向calss表插入s_id=2的数据时,需要确认student表里有id=2的数据, 否则会出错

3.2 一对一

原理:这个和一对多类似,比如用户表格和身份证表格的关系,必须一对一
实现: article = db.relationship('Article', uselist=False, backref='article_look')
解释:改为uselist=False表只返回一个内容,其它操作一样

3.3 多对多

原理:这个和一对多类似但大有不同,查询方法相同,用于解决例如关注与被关注等问题。

区别:一对多(多的表有重复id),但是多对多两张表可以没有重复id,为了联系,通过中介表,即重复关系id的表,其中中介表通过db.Table创建,通过secondary,联系中介表

创建:

article_author = db.Table('article_author', db.Column('article_id', db.Integer, db.ForeignKey('article.id'), primary_key=True),
                                        db.Column('author', db.Integer, db.ForeignKey('author.id'), primary_key=True),
        )
class Author(db.Model):
        __tablename__ = 'author'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(30))
        article = db.relationship('Article',secondary=article_author, backref='article_look')

class Article(db.Model):
        __tablename__ = 'article'
        id = db.Column(db.Integer, primary_key=True)
        title = db.Column(db.String(30))
db.create_all()

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgfickb
系列文章
更多 icon
同类精品
更多 icon
继续加载