一.数据库
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)
2.数据库操作
2.1 创建表单
格式:db.create_all()
2.2 添加内容
格式:
content=Node(body='d')
db.session.add(content)
db.session.commit()
2.3 读取内容
格式:模型.query.过滤方法.查询方法
2.3.1 过滤方法
具体:
- ==
Node.query.filter(Node.id == 10).all()[0].body
- like
a = Node.query.filter(Node.body.like('%534354%')).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.4 更改内容
格式:
node = Node.query.filter(Node.id == 5).first()
node.body='dbdbdbd'
db.session.commit()
解释:直接通过获取;然后修改;提交即可
2.5 删除内容
node = Node.query.filter(Node.id == 5).first()
db.session.delete(node)
db.session.commit()
解释:直接通过获取;然后删除;提交即可
3.数据库关联操作
3.1 一对多
原理:其实就是表单之间的关联,比如:作者为一个表单(属于一[指的是对应该表一条记录]),一个文章表单(属于多[多指的是对应该表多条记录])。一对多,就是说通过作者表单直接访问到文章表单的内容,关键就是在这两个表设置相同的id(或其它相同的内容),通过相同的内容进行访问。
创建:
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'))
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一侧),用该参数反查
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()