欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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()

使用,注意要重新继承重写的类
Flask(四):数据库的连接+ORM的操作和封装
使用增删改

# 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()

相关标签: ORm 连接数据库