Flask学习笔记(4)

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 时可能会报有关版本未更新的错误,可以参考我错误记录的随笔。

 

猜你喜欢

转载自www.cnblogs.com/Ishtarin/p/12285662.html