Day04
本篇主要是介绍 flask 中与数据库有关的部分。应该是后台中比较基础也比较重要的部分。
flask与SQL
flask可以搭配许多优秀的数据库相关库,使我们对数据库的操作变得非常方便。这里以 MySQL 为例,介绍最基本的操作,其它的数据库找到对应插件库使用起来大同小异。
下载扩展包:pip install flask-sqlalchemy
下载mysql驱动:pip install mysql-python
python3可以 pip install pymysql作为驱动,但是在使用时要加上语句
impory pymysql
pymysql.install_as_MySQLdb()
SQLAlchemy是一个基于python的优秀的ORM框架,这里介绍基本使用。
导入:from flask_sqlalchemy import SQLAlchemy
初始化:db=SQLAlchemy(app)
使用:config.py 连接数据库:
#使用 app.config.from_object(config) 导入config配置
#config.py中内容,mysql为例 DIALECT = 'mysql' #固定 DRIVER = 'mysqldb' #固定 USERNAME = 'root' #数据库账户 PASSWORD = 'root' #数据库密码 HOST = '127.0.0.1' #以本地为例 PORT = '3306' #若没修改过,mysql默认3306 DATABASE = 'xxx' #数据库名 #固定写法为 dialect+driver://username:password@host:port/databases SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=utf8".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT, DATABASE) SQLALCHEMY_TRACK_MODIFICATIONS = True
在这个模型中,用户可以通过自定义对象来映射数据库中的表。
建表操作:
#新建Article表,必须继承默认基类db.Model: class User(db.Model): __tablename__ = 'user' id = db.Column(db.Integer,primary_key=True,autoincrement=True) class Article(db.Model): __tablename__ = 'article' #表名,默认为类名小写 ''' 新建字段用db.Column,String()代表varchar,其余基本见名知意 ''' id = db.Column(db.Integer, primary_key=True, autoincrement=True) title = db.Column(db.String(100), nullable=True) content = db.Column(db.Text, nullable=False) #添加外键 author_id = db.Column(db.Integer,db.ForeignKey('user.id')) #必须放在表后面 db.create_all()
增删改查:
#增 article1 = Article(title='aaa',content='bbb') db.session.add(article1) db.session.commit() #查 result = Article.query.filter(Article.title=='aaa') #返回所执行的sql语句 result = Article.query.filter(Article.title=='aaa').all() #返回的是sql语句的执行结果,一个list title = result[0].title ... #改 '''1.查找'''article = Article.query.filter(Article.title=='aaa').first() '''2.修改'''article.title = 'new title' '''3.提交'''db.session.commit() #删 '''1.查找'''article=Article.query.filter(Article.content=='bbb').first() '''2.删除'''db.session.delete(article) '''3.提交'''db.session.commit()
建立关系(表之间的外键连接)
author = db.relationship('User',backref=db.backref('articles')) ''' 第一个参数写模型的名字,比如我想找一篇文章的作者,就填'User',函数会自动查找与User的外键有关的表 第二个参数用于反向引用,比如我想查找某个用户写过的所有文章 ''' #基于此的另一种数据添加方法 article = Article(title='aaa',content='bbb') #不直接写author_id参数 article.author = User.query.filter(User.id == 1).first() db.session.add(article) db.session.commit() #用关系来进行表之间的查找,比如查找文章的作者 xxx = article.author.username #反向查找,查找作者写过的所有文章 user = User.query.filter(User.username=='xxx').first() result = user.articles
flask-script
python作为一门可以用来写脚本的语言,flask 也有对应的库。
作用:使用命令行来操作flask。在实际开发中,其实并不常用上例中 db.create_all() 的方法来建表,更多的是使用 script 结合 migrate 在控制台更新我们的数据库。
使用步骤:
#安装 pip install flask-script #新建文件manager.py,以下代码为manager文件中代码 #导包 from flask-script import Manager #初始化 manager = Manager(app) #具体命令 @manager.command def runServer(): print('服务器启动成功!') if __name__ == '__main__': manager.run() #在命令行使用 python manager.py runServer
若要集成其它script:
# 新建文件,例db_script.py from flask-script import Manager DBManager = Manager() #不需要传app @DBManager.command def init(): print('数据库初始化')
# 在主manager中: manager.add_command('db',DBManager) # 在命令行中的使用 python manager.py db init
flask-migrate
使用db.creat_all()不能重复创建已有表,即不能修改表的字段,除非删除表后重新创建。flask-migrate可以在每次修改模型后将修改内容映射到数据库。
使用步骤:
# 安装 pip install flask-migrate #此例用命令行的方式来使用 from flask-migrate import Migrate,MigrateCommand manager = Manager(app) # 1.绑定app和db migrate = Migrate(app,db) # 2.把MigrateCommand命令添加到manager manager.add_command('db',MigrateCommand) ''' 包含的常用命令有 init migrate upgrade '''
一般使用顺序为,init,migrate,upgrade。init只有在初次使用时用到,在控制台 python manager.py db init 后,项目目录下会自动生成一个 migrate 的文件夹,用来管理每次数据库的版本变更。之后每次要更新数据库时只需要使用 python manager.py db migrate 和 python manager.py db upgrade 即可。migrate 时可能会报有关版本未更新的错误,可以参考我错误记录的随笔。