前言
这里只针对flask中的sqlalchemy来进行介绍,但也会介绍一些flask操作
单独使用sqlalchemy的时候是并不需要传入app对象的
sqlalchemy的思想是把表当作一个类,把表中的数据当作一个对象来处理,也就是说当针对某一条数据来进行操作的时候
是先实例这一条数据再进行更改或删除或增加操作的
当只有一个视图文件的时候(单app)
# 使用前需要先创建sqlalchemy和flask的实例对象
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 这里需要把app作为参数传入sqlalchemy来创建实例
db = SQLAlchemy(app)
# 之后在另一个文件中导入db创建数据表类,需要继承db.Model
from <另一个文件的名字> import db
class Name(db.Moudel):
__tabelname__ = "配置表的名字"
id = db.Column(db.Integer(255), primary_key=True)
name = db.Column(db.String(255))
# 写好类之后需要使用create_all()来创建数据表
db.create_all()
# db.session可以用来操作数据库,查找Name表的name字段
db.session.query(Name.name)
#---------------------以上是没有使用蓝图的情况-----------------
# 如果使用了蓝图,则需要在每一个蓝图的__init__文件当中来做实例flask对象和db对象(实际上不使用sqlalchemy的时候也是这样)
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = register_blueprint(<视图函数对象>) # 也可以在视图函数中定义一个专门用来注册蓝图的函数
db = SQLAlchemy(app)
# 假如现在已经创建好模型单表了和配置好了数据库,创建实际表的时候需要加上app参数来指定创建哪个蓝图的数据表
db.create_all(app=app)
初始化的注意点
flask中来配置数据库的时候一定要先配置好链接哪一个数据库
app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root@123456:3306//data'
初始化之后图表并不会被创建,而是需要我们自己去调用db.create_all()来创建
如果是5.7版本的数据库会有一个警告的bug,这个不用理会,据说是没有影响的
配置数据库参数的时候也需要配置SQLALCHEMY_TRACK_MODIFICATIONS这个参数,如果不配置会有一个警告
在配置数据表模型的时候,如果程序运行过程中,没有加载模型类的话是没有办法创建数据表的,即使使用了db.create_all()
创建数据表(不能创建数据库)
在falsk中是使用app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = True的形式来配置数据库的
创建数据表类的时候(如果只是做查询用),不必把每一个字段都填上
from flask import Flask
app = Flask(__name__)
class Default(object):
SQLALCHEMY_DATABASE_URI = 'mysql+pymysql://root:123456@127.0.0.1:3306/<数据库名>'
app.config.form_object(Default)
创建数据表的模型
表的模型是一个类
如果不通过__tablename__来指定表的名称,那么表的默认名称就是类名的全小写
类中每个赋值语句都是表中的一列,通过name = db.Column()来设置列
也可以通过这个模型来查询数据表中的信息,前提是设置的模型的表名和字段需要一致
通过加入primary_key=True参数来设置主键
通过加入db.ForeignKey("表明.字段")来添加外键约束
db.Column()参数
通过这个参数赋值给一个变量来创建表的列, 如果列名不指定的话默认名称就是变量名
第一个参数为字段的类型,常用有db.Integer,db.String
可以通过填入name = ""来指定每一列的名称
通过primary_key=True来设置主键
数据库操作(增)
如果需要增加数据,确保模型中有init构造方法
先实例这个表的类
uesr = User("字段1","字段2","字段3")
db.session.add(user)
db.serssion.commit(user)
数据库操作(删)
删除操作和增加操作是差不多的
把add更改为delete即可
db.session.delete(user)
db.session.commit()
数据库操作(改)
用的少不做介绍
数据库操作(查)(重)
原始sql语句 select * from user 条件语句
SELECT <目标列名序列> -- 需要哪些列
FROM <表名> [JOIN <表名> ON <连接条件>] -- 来自哪些表
[WHERE <行选择条件>] -- 根据什么条件
[GROUP BY <分组依据列>]
[HAVING <组选择条件>]
[ORDER BY <排列依据列>]
[LIMIT <限制数量>]
----------------------------------------
以下的操作所有都是通过db.session来调用的
query(): 相当与是原始sql语句的*,用于指定查询的字段,不指定表示所有字段
filter()条件语句,相当于where, 多个参数就是where -- and --
在filter()中,如果又多个条件,默认是and条件,需要使用or条件这样写即可filter(or_(条件1,条件2))
order_by()排序语句,默认是升序,参数中填入desc(字段)为降序,或者字段.desc()
having()也是条件语句,作用为进一步筛选数据
group_by()分类语句,如果不指定字段的话没有任何效果,配合func.count()函数来使用
limit()限制语句,相当于limit --, 参数为指定输出前几个参数
其他操作(注意事项)
创建数据表模型时id = db.Column(name="可以自定义字段名称", db.String(64))
查询时,如果使用了label("")取了别名,那么在后续进行条件判断或者排序的时候需要使用别名来判断或排序