Flask(7):SQLAlchemy的使用

文章目录

  • 一、数据库的连接
    • 1.flask 数据库操作和Django对比
    • 2.flask-sqlalchemy
    • 3.pycharm安装flask-sqlalchemy
    • 4.连接数据库(mysql或者sqlite3)
  • 二、SQLAlchemy的操作
    • 1.增加数据
    • 2.查询数据
    • 3.修改数据
    • 4.删除数据
  • 三、flask中将数据库方法的封装

一、数据库的连接


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:123456@localhost/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端口,可以自己修改

二、SQLAlchemy的操作

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)
data = UserInfo.query.get(ident=1) #效果同上

③filter 和 filter_by 过滤条件

data = UserInfo.query.filter_by(name="laowang").all()
data = UserInfo.query.filter(UserInfo.name == "laowang").all()  #效果同上

④first()和last()

  • 返回符合条件的第一条数据和最后一条
  • 返回值对象
  • 如果没有数据 返回None
data = UserInfo.query.filter(UserInfo.name == "laowang").first()
data = UserInfo.query.filter(UserInfo.name == "laowang").last()

⑤order_by 排序

# -----------------------------升序
data = UserInfo.query.order_by(UserInfo.id).all()
data =UserInfo.query.order_by("id").all()  # 效果同上

#------------------------- 降序
data = UserInfo.query.order_by(UserInfo.id.desc()).all()
data =UserInfo.query.order_by(db.desc("id")).all()  # 效果同上

⑥分页limit()和偏移offset()

## sql  select * from userinfo limit 2,3;  2代表从哪里开始   3 取多少条
data = UserInfo.query.offset(2).limit(2).all()   

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()
db.session.delete(data)
db.session.commit()

#----------------多条筛选删除
data = UserInfo.query.filter(UserInfo.id == 2).delete()
db.session.commit()

三、flask中将数据库方法的封装

为了让其具备类似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(7):SQLAlchemy的使用_第1张图片
使用增删改

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

你可能感兴趣的:(Flask框架)