Flask-SQLAlchemy
Flask-SQLAlchemy
的使用对SQLAlchem
y进行了封装和优化:
-
Flask-SQLAlchemy是Flask框架的一个插件;
-
Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件,使得我们在Flask中使用sqlalchemy更加的简单。
1.安装
pip install flask-sqlalchemy
2.Flask-SQLAlchemy的使用要点
2.1 数据库连接
数据库初始化不再是通过create_engine
。
1.跟sqlalchemy
一样,定义好数据库连接字符串DB_URI
。
HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'flask_db'
USERNAME = 'root'
PASSWORD = 'root'
DB_URL = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
2.将这个定义好的数据库连接字符串DB_URI
,通过SQLALCHEMY_DATABASE_URI
这个key
名配置到 app.config
中。
# 把连接数据库参数设置到 app中
app.config['SQLALCHEMY_DATABASE_URL'] = DB_URL
3.使用 flask_sqlalchemy.SQLAlchemy
这个类定义一个对象,并将 app
传入进去。
db = SQLAlchemy(app)
2.2 创建ORM模型类
之前都是通过Base = declarative_base()
来初始化一个基类,然后再继承,在Flask-SQLAlchemy
中更加简单了。
1.还是跟使用sqlalchemy一样,定义模型。现在不再是需要使用 delarative_base
来创建一个基类。而是使用db.Model
来作为基类。
2.在模型类中, Column 、 String 、 Integer
以及 relationship
等,都不需要导入了,直接使用 db
下面相应的属性名就可以了。
3.在定义模型的时候,可以不写 __tablename__
,那么 flask_sqlalchemy
会默认使用当前的模型的名字转换成小写来作为表的名字,并且如果这个模型的名字用到了多个单词并且使用了驼峰命名法,那么会在多个单词之间使用下划线来进行连接,虽然flask_sqlalchemy
给我们提供了这个特性,但是不推荐使用。(增强代码可读性,提高团队合作效率)
# 2.创建模型类User
class User(db.Model):
__tablename__ = 't_user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50))
pwd = db.Column(db.String(50))
def __repr__(self):
return 'User:<username=%s, password=%s, id=%s>'.format(self.name, self.pwd, self.id)
2.3 将ORM模型映射到数据库表
写完模型类后,要将模型映射到数据库的表中,使用以下代码即可
-
删除数据库表:
db.drop_all()
-
创建数据库表:
db.create_all()
2.4 session的使用
以后session也不需要使用 sessionmaker 来创建了,直接使用 db.session
就可以了,操作这个session的时候就跟之前的 sqlalchemy 的 session 是一样的。
2.5 添加数据
这时候就可以在数据库中看到已经生成了对应表了。
添加数据和之前的没有区别,只是session成为了一个db的属性
2.6 查询数据:
1.单表查询
查询数据不再是之前的session.query
方法了,而是将query属性放在了db.Model
上,所以查询就是通过“模型名.query”
的方式进行查询了, query 就跟之前的sqlalchemy中的query方法是一样用的。
2.多表查询
如果查找数据涉及多个模型,只能使用db.session.query(模型名).all()
这种方式。
2.7 修改数据:
修改数据和之前的没有区别,只是session成为了一个db的属性。
2.8 删除数据:
删除数据跟添加数据和修改数据类似,只不过session是db的一个属性而已。
from flask import *
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
# 数据库的配置变量
USERNAME = 'root'
PASSWORD = 'root'
HOSTNAME = 'localhost'
PORT = '3306'
DATABASE = 'flask_db'
DB_URI = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8mb4'.format(USERNAME, PASSWORD, HOSTNAME, PORT, DATABASE)
# 把连接数据库参数设置到 app中
app.config['SQLALCHEMY_DATABASE_URI'] = DB_URI
# 1.创建数据库连接
db = SQLAlchemy(app)
# 2.创建模型类User
class User(db.Model):
__tablename__ = 't_user'
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.String(50))
pwd = db.Column(db.String(50))
def __repr__(self):
return 'User:<username=%s, password=%s, id=%s>'.format(self.name, self.pwd, self.id)
# 3.创建数据库表
# db.drop_all()
# db.create_all()
@app.route('/')
def index(): # put application's code here
return render_template('index.html')
@app.route('/add')
def add(): # 增加
name = request.args.get('name')
pwd = request.args.get('pwd')
# 将数据插入t_user表中
user = User(name=name, pwd=pwd)
db.session.add(user)
db.session.commit()
return "添加数据成功"
@app.route('/query')
def query():
id = request.args.get('id')
user = db.session.query(User).filter(User.id == id).first()
print('查询成功,查到的用户名是:{},密码是:{},id是:{}'.format(user.name, user.pwd, user.id))
return '查询成功,查到的用户名是:{},密码是:{},id是:{}'.format(user.name, user.pwd, user.id)
@app.route('/update')
def update():
pass
@app.route('/delete')
def delete():
name = request.args.get('name')
user = User.query.filter(User.name == name).first()
db.session.delete(user)
db.session.commit()
return "删除用户:{}成功".format(user.name)
if __name__ == '__main__':
app.run(host='0.0.0.0', port=8888, debug=True)
index.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>测试flask的sqlalchemy</title>
</head>
<body>
<a href="/add?name=zs&pwd=123">新增操作</a><br>
<a href="/query?id=2">查询操作</a><br>
<a href="/update?id=2">修改操作</a><br>
<a href="/delete?name=zs">删除操作</a><br>
</body>
</html>