Flask(7):Flask中的SQLAlchemy的使用

一、数据库的连接


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

使用,注意要重新继承重写的类
在这里插入图片描述
使用增删改

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

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张烫麻辣亮。

谢谢老板支持!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值