Flask(四):数据库的连接+ORM的操作和封装
程序员文章站
2022-04-05 08:58:00
...
文章目录
一、数据库的连接
1.flask 数据库操作和Django对比
- django 中使用ORM链接操作数据库,如果不能够用ORM 站点管理功能不能够使python使用pymysql链接操作数据库
- flask中也可以使用pymysql链接,但是需要装sqlalchemy(python的开源的ORM框架)
2.flask-sqlalchemy
对sqlalchemy 进行封装
3.pycharm安装flask-sqlalchemy
pip install flask-sqlalchemy
pip install pymysql
官方文档
http://www.pythondoc.com/flask-sqlalchemy/config.html#uri
4.连接数据库(mysql或者sqlite3)
注意:连接mysql数据库需要创建库
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import os
app = Flask(__name__)
#1.-------------------------------------链接数据库
BASE_DIR = os.path.abspath(os.path.dirname(__file__))##当前文件 项目所在的根目录
# 第一步:配置sqllite3
app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///" + os.path.join(BASE_DIR,"test.db")
# 配置mysql
app.config["SQLALCHEMY_DATABASE_URI"]="mysql://root:aaa@qq.com/flask"
# 第二步:链接sqllit3 配置
app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True ### 请求结束之后自动提交
app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True ## 跟踪修改 flask 1.x 之后增加的配置项
# 第三步:绑定 flask项目
db = SQLAlchemy(app)
#2.------------------------------------ 创建模型
class UserInfo(db.Model):
__tablename__ = 'userinfo' ## 表名
id = db.Column(db.Integer,primary_key=True)
name = db.Column(db.String(32))
time = db.Column(db.DATETIME)
#3.--------------------------------------数据迁移
db.create_all() ## 同步表结构
@app.route('/') # 路由
def index(): # 视图
return 'hello world' # 返回值
if __name__ == '__main__':
# app.run()#项目启动,默认5000端口,可以自己修改
二、ORM的操作
1.增加数据
# ---------------------单条增加 add
userinfo = UserInfo(name="老王",age=19)
db.session.add(userinfo)
db.session.commit()
#----------------------- 多条增加 add_all
db.session.add_all([
UserInfo(name="老王",age=19),
UserInfo(name="老王",age=19),
UserInfo(name="老王",age=19),
UserInfo(name="老王",age=19)
])
db.session.commit()
2.查询数据
①all(),列表形式返回所有数据
data = UserInfo.query.all()
print (data)
#可以使用for循环 获取每个对象的值
②get()
- 返回是一个对象
- 只能通过id进行查询
- 如果没有结果 返回 None
----------------------------------------------------两种方法
data = UserInfo.query.get(1)
print (data)
print (data.name)
-----------------------------------------------------
data = UserInfo.query.get(ident=1)
print (data)
print (data.name)
③filter 和 filter_by 过滤 条件
data = UserInfo.query.filter_by(name="laowang").all()
print (data)
------------------------------------------------------------------
data = UserInfo.query.filter(UserInfo.name == "laowang").all()
print (data)
④first()和last()
- 返回符合条件的第一条数据和最后一条
- 返回值对象
- 如果没有数据 返回None
data = UserInfo.query.filter(UserInfo.name == "laowang").first()
print (data)
------------------------------------------------------
data = UserInfo.query.filter(UserInfo.name == "laowang").last()
print (data)
⑤order_by 排序
升序
# -----------------------------升序
data = UserInfo.query.order_by(UserInfo.id).all()
print (data)
-----------------------------------------
data =UserInfo.query.order_by("id").all()
print (data)
降序
#------------------------- 降序
# data = UserInfo.query.order_by(UserInfo.id.desc()).all()
# print (data)
-------------------------------------------------------
data =UserInfo.query.order_by(db.desc("id")).all()
print (data)
⑥分页limit()和偏移offset()
## sql select * from userinfo limit 2,3; 2代表从哪里开始 3 取多少条
data = UserInfo.query.offset(2).limit(2).all()
print (data)
## limit(2) 取2条数据, offset(2) 偏移2
3.修改数据
#先查询数据
data = UserInfo.query.filter(UserInfo.id==1).first()
data.name = "lisi"
db.session.merge(data)
db.session.commit()
4.删除数据
##-------------------------------------------------- 删除
#----------------单挑删除delete
# data = UserInfo.query.filter().first()
# print(data.id)
# db.session.delete(data)
# db.session.commit()
#----------------多条筛选删除
data = UserInfo.query.filter(UserInfo.id == 2).delete()
db.session.commit()
三、ORM的封装
为了让其具备类似Django的save和update和delete方法,我们给其封装
class BaseModel(db.Model):
##
__abstract__ = True ### 声明当前类为抽象类,被继承 调用不会被创建
id = db.Column(db.Integer,primary_key=True)
def save(self):
db.session.add(self)
db.session.commit()
def merge(self):
db.session.merge(self)
db.session.commit()
def delete(self):
db.session.delete(self)
db.session.commit()
使用,注意要重新继承重写的类
使用增删改
# userinfo = UserInfo(name="awu",age=19)
# # 增加数据
# userinfo.save()
### 更新数据
# userinfo = UserInfo.query.get(8)
# userinfo.name="aliu"
# userinfo.merge()
## 删除数据
# userinfo = UserInfo.query.get(8)
# userinfo.delete()