Flask-SQLAlchemy
的使用对SQLAlchem
y进行了封装和优化:
Flask-SQLAlchemy是Flask框架的一个插件;
Flask-SQLAlchemy是对SQLAlchemy进行了一个简单的封装的一个插件,使得我们在Flask中使用sqlalchemy更加的简单。
pip install flask-sqlalchemy
数据库初始化不再是通过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)
之前都是通过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:'.format(self.name, self.pwd, self.id)
写完模型类后,要将模型映射到数据库的表中,使用以下代码即可
删除数据库表:db.drop_all()
创建数据库表:db.create_all()
以后session也不需要使用 sessionmaker 来创建了,直接使用 db.session
就可以了,操作这个session的时候就跟之前的 sqlalchemy 的 session 是一样的。
这时候就可以在数据库中看到已经生成了对应表了。
添加数据和之前的没有区别,只是session成为了一个db的属性
1.单表查询
查询数据不再是之前的session.query
方法了,而是将query属性放在了db.Model
上,所以查询就是通过“模型名.query”
的方式进行查询了, query 就跟之前的sqlalchemy中的query方法是一样用的。
2.多表查询
如果查找数据涉及多个模型,只能使用db.session.query(模型名).all()
这种方式。
修改数据和之前的没有区别,只是session成为了一个db的属性。
删除数据跟添加数据和修改数据类似,只不过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:'.format(self.name, self.pwd, self.id)# 3.创建数据库表
# db.drop_all()
# db.create_all()@app.route('/')
def index(): # put application's code herereturn 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
测试flask的sqlalchemy
新增操作
查询操作
修改操作
删除操作