flask创建数据模型及数据迁移

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)两步操作即可,另外不是每次迁移都会成功,迁移出错的时候就得自己手动解决

猜你喜欢

转载自blog.csdn.net/WanYu_Lss/article/details/82054997