1.flask-sqlalchemy
使用flask创建数据表,并将这些数据表保存到指定的数据库需要借助一个扩展库flask-sqlalchemy,使用这个库可以构建我们想要的数据表,并且可以连接并操作指定的数据库。
2.连接数据库
使用flask-sqlalchemy连接不同的数据库操作是不同的,这里介绍连接sqlite与MySQL的方法
1.连接sqlite的方法:sqlite:///+数据库文件名
如何配置
# 配置数据连接地址
base_dir = os.path.dirname(__file__)
database_uri = 'sqlite:///' + os.path.join(base_dir, 'data.sqlite')
app.config['SQLALCHEMY_DATABASE_URI'] = database_uri
配置数据库连接地址都是通过'SQLALCHENY_DATABASE_URI'这个参数来完成的,因为这里我们指定的是sqlite数据库,所以需要指定sqlite数据库保存的地址与数据库名,这里我先获取到当前地址,将这个地址与数据库名拼接在一起,指定了数据库的连接地址。
2.连接MySQL数据库:'mysql+驱动名://数据库用户名:数据库密码@本机地址:端口号/使用的数据库名'
示例
# 配置数据库的连接地址
flask.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:12345678@localhost:3306/flask'
这里我使用的驱动是pymysql,我登录数据库的用户名为root,密码为12345678,端口号是3306,连接MySQL中的名为flask的数据库。
(1)基础代码,启动代码
from flask import Flask
from flask_script import Manager,prompt_bool
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import MigrateCommand,Migrate
flask = Flask(__name__)
manager = Manager(flask)
if __name__ == '__main__':
manager.run()
(2)各种配置,创建数据库操作对象,添加终端命令
# 配置数据库的连接地址
flask.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+pymysql://root:199712@localhost:3306/flask'
# 设置自动提交
flask.config['SQLALCHEMY_COMMIT_ON_TEARDOWN'] = True
# 创建数据库操作对象
sql = SQLAlchemy(flask)
# 添加终端命令
manager.add_command('sql',MigrateCommand)
跟Django框架不同的是,flask对数据表以及数据的操作都是通过数据库操作对象来完成的,所以在做任何操作之前都需要先创建数据库的操作对象。而且之所以需要添加终端命令是因为flask框架并不能像Django框架那样直接makemigrations,migrate生成数据表,而且没有终端命令,生成数据表与删除数据表的命令分别是sql.create_all(),sql.drop_all(),(sql使我们创建数据库操作的对象,可以更改).但是很遗憾,这两条命令并不能直接在终端下使用,所以我们需要自己将它添加到终端命令中。
(3)构建函数,完成终端生成数据表与删除数据表
# 添加终端命令创建数据表
@manager.command
def createall():
sql.create_all()
return '数据表已创建'
# 添加终端命令删除数据表
@manager.command
def dropall():
if prompt_bool('您确定要删库跑路吗?'):
sql.drop_all()
return '数据表已删除'
return '操作取消'
通过这两个函数就能够通过终端命令完成数据表的创建与删除;如(python manage.py sql createall);这里manage.py是你当前的py文件名,sql是在前面添加终端命令你指定的名字,createall是上面定义的用来生成数据表的函数,删除数据表也是同样的操作,但是现在我们还没有数据模型类,无法生成数据表。
3.创建数据模型类
创建一个数据模型类,添加字段
# 创建数据模型类
class UserModel(sql.Model):
# 设置表名
__tablename__ = 'student'
id = sql.Column(sql.Integer,primary_key=True,autoincrement=True)
name = sql.Column(sql.String(32),unique=True)
age = sql.Column(sql.Integer, default=1)
gender = sql.Column(sql.SmallInteger)
email = sql.Column(sql.String(32),nullable=True)
这里也有一些与Django不同的是,它不会默认生成id字段;需要注意String必须要设置长度;那么有了数据模型类之后就可以生成数据表了,用我们自己创建的终端命令python manage.py createall
4.插入数据实验一下
@flask.route('/insert/')
def insert():
# 创建对象
wang = UserModel(name='王宝强',age=18,gender=1,email='[email protected]')
bai = UserModel(name='白百何',age=30,gender=0,email='[email protected]')
chen = UserModel(name='陈羽凡',age=38,gender=1,email='[email protected]')
li = UserModel(name='李小璐',age=34,gender=0,email='[email protected]')
jia = UserModel(name='贾乃亮',age=50,gender=1,email='[email protected]')
wen = UserModel(name='文章',age=60,gender=1,email='[email protected]')
peng = UserModel(name='岳云鹏',age=56,gender=1,email='[email protected]')
# 保存到数据库,一次性保存多条数据
sql.session.add_all([wang,bai,chen,li,jia,wen,peng])
# 提交操作,若没有设置自动提交,每次执行操作都需要手动提交一次
# db.session.commit()
return '数据添加成功'
到这里就有点小小的问题了,如果在创建数据模型的时候忘记添加某个字段了,现在想再加上这个字段,如果使用Django框架我们可以先makemigrations然后在migrate一下,就能将数据表迁移,但是flask却不能直接迁移,需要借助一个扩展库flask-migrate.
5.flask-migrate
如果我们在生成数据表之后又想添加字段,我们可以先删掉原来的数据表,然后再创建,但是这样的话之前的数据也会被我们删掉,所以这里我们需要借助flask-migrate来执行数据迁移
(1)安装flask-migrate
pip install flask-migrate
(2)创建迁移对象
# 创建迁移对象
migrate = Migrate(flask,sql)
(3)初始化,只需要执行一次,创建用户迁移脚本的目录及相关文件
python manage.py sql init
(4)根据数据模型与数据表,生成迁移脚本
python manage.py sql migrate
(5)执行迁移脚本
python manage.py sql upgrade
注意:这里的sql是我在添加终端命令的时候指定的名字,你也可以指定不同的名字,另外在执行数据库迁移的时候,比如你增加了age字段,那么在初始化之后只需要执行(4)(5)两步操作即可,另外不是每次迁移都会成功,迁移出错的时候就得自己手动解决