三.Flask 数据库[flask-sqlalchemy]
一.数据库
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 添加内容
格式:
content=Node(body='d')
db.session.add(content)
db.session.commit()
db.session.close()
2.3 读取内容
格式:模型.query.过滤方法.查询方法
2.3.1 过滤方法
具体:
- ==
Node.query.filter(Node.id == 10).all()[0].body
- like
a = Node.query.filter(Node.body.like('S4354%')).all()
for i in a:
print(i.body)
- in
a = Node.query.filter(Node.id.in_([1,2])).all() #反馈回来id=1和id=2的不整条数据
- not in
a = Node.query.filter(~Node.id.in_([1,2])).all()
- and
from sqlalchemy import and_;a = Node.query.filter(and_(Node.id==1,Node.body =='51')).all() #and并列两个条件都成立返回一条结果(简单的可以用逗号分割)
- 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
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01 -
怎样阻止微信小程序自动打开
PHP中文网 06-13