Flask操作数据库
基本上只要是应用程序都会和数据库打交道,今天我来学习的是flask这个web开发框架怎么样和数据库完美的交互
1,首先我们来看一段数据库创建,和数据添加
# _*_ coding: utf-8
from flask import Flask
# 这个数是操作数据库的框架
from flask_sqlalchemy import SQLAlchemy
__author__ = 'hb'
__date__ = '2019/2/20 14:48'
app = Flask(__name__)
class Config(object):
"""配置参数"""
# 配置sqlalchemy的配置参数
SQLALCHEMY_DATABASE_URI = "mysql://root:mysql@127.0.0.1:3306/flaskmysql"
# 设置sqlalchemy自动跟踪数据库,也就是有变化时自动变化
SQLALCHEMY_TRACK_MODIFICATIONS = True
app.config.from_object(Config)
# 创建数据库sqlalchemy工具对象
db = SQLAlchemy(app)
class Role(db.Model):
__tablename__ = "tbl_roles"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
users = db.relationship("User", backref="Role")
# 显示对象的时候更直观
def __repr__(self):
return "Role object name=%s"%self.name
class User(db.Model):
"""用户表"""
"""
primary_key 如果设为 True,这列就是表的主键
unique 如果设为 True,这列不允许出现重复的值
index 如果设为 True,为这列创建索引,提升查询效率
nullable 如果设为 True,这列允许使用空值;如果设为 False,这列不允许使用空值
default 为这列定义默认值
"""
__tablename__ ="tbl_users"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
email = db.Column(db.String(128), unique=True)
pswd =db.Column(db.String(128))
# 这里很明显是外键,mysql外键不懂得同学可以去查下资料
role_id = db.Column(db.Integer,db.ForeignKey("tbl_roles.id"))
def __repr__(self):
return "User object name=%s"%self.name
if __name__ == '__main__':
# 清除数据库里面的所有的数据
db.drop_all()
# 创建所有的表
db.create_all()
ro1 = Role(name='admin')
ro2 = Role(name='user')
db.session.add_all([ro1, ro2])
db.session.commit()
us1 = User(name='wang', email='wang@163.com', pswd='123456', role_id=ro1.id)
us2 = User(name='zhang', email='zhang@189.com', pswd='201512', role_id=ro2.id)
us3 = User(name='chen', email='chen@126.com', pswd='987654', role_id=ro2.id)
us4 = User(name='zhou', email='zhou@163.com', pswd='456789', role_id=ro1.id)
# 添加数据
db.session.add_all([us1, us2, us3, us4])
# 将数据库保存到数据中当中去
db.session.commit()
app.run(debug=True)
执行完上面的代码,其实在我们的数据库中就有了一段数据
mysql> select * from tbl_users;
+----+-------+---------------+--------+---------+
| id | name | email | pswd | role_id |
+----+-------+---------------+--------+---------+
| 1 | wang | wang@163.com | 123456 | 1 |
| 2 | zhang | zhang@189.com | 201512 | 2 |
| 3 | chen | chen@126.com | 987654 | 2 |
| 4 | zhou | zhou@163.com | 456789 | 1 |
+----+-------+---------------+--------+---------+
2,介绍相关操作
#查询所有的Role对象
li = Role.query.all()
Out[2]: [<db_demo.Role at 0x10388d190>, <db_demo.Role at 0x10388d310>]
In[3]:r = li[0]
#获取查询的第一个对象
In [8]: Role.query.first()
#根据主键来获取对象
In [11]: r = Role.query.get(2)
#这里再隆重介绍另外一中查询方式
In [15]: db.session.query(Role).all()
#根据对象的Id来查找
db.session.query(Role).get(2)
#查询第一个对象
db.session.query(Role).first()
#查询执行名字的对象 filter_by 是filter的特殊形式
User.query.filter_by(name="wang").all()
#多个限制条件叠加
User.query.filter_by(name="wang", role_id=1).first()
#使用filter来多条件查询
user = User.query.filter(User.name=="wang", User.role_id==1).all()
# 使用 _or 或条件查询
from sqlalchemy import or_
User.query.filter(or_(User.name=="wang", User.email.endwith("163.com"))).all()
# offset 偏移,跳过几条数据
User.query.offset(2).all() # 跳过两条数据,从第三条数据开始
# limit 限制获取多少条数据
User.query.offset(1).limit(2).all()
#根据相关的参数升序或者降序 这里的"-id"表示降序
User.query.order_by("-id").all()
#还有另外一种表达方式 升序是asc()
User.Query.order_by(User.id.desc()).all()
#目前这里使用的都是等于 那mysql里面的一些聚合函数怎么表达呢,下面的表达就类似mysql中的select role_id,cout(role_id) from User group role_id
from sqlalchemy import func
db.session.query(User.role_id,func.count(User.role_id)).group_by(User.role_id).all()
out:[(1L, 2L), (2L, 2L)]
# 上面介绍的是查询语句,接下来我们介绍下更新语句的写法
User.query.filter_by(name="zhou").update({"name":"python","email;":"hongbiao@163.com"})
# 修改是需要保存的,因此,需要提交到数据库
db.seesion.commit()
#删除操作
user = User。query.get(3)
db.session.delete(user)
db.session.commit()
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)