在项目中都会使用到数据库的,Flask本身不具备数据库引擎,但是它有丰富的第三方库,支持不同的数据库,比如,MySQL、SQLite、postgres、Oracle。其中
flask_sqlalchemy
是对SQLAlchemy
做了一层封装,可以在flask中使用更加方便。其原理还是SQLAlchemy
这台东西。
SQLAlchemy框架组件介绍
组成部分:
- Engine:框架引擎
- Connection Pooling:数据库连接池
- Dialect 选择连接池的DB API种类
- Schema/Types 框架和类型
- SQL Expression Language:SQL表达式语言
SQLAlchemy本身无法操作数据库,其必须以pymysql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用的数据库API,从而实现对数据库的操作,如:
#SQLite
sqlite:///database.db
#MYSQL
mysql+pymysql://<user>:<password>@<host>[:port]/<dbname>
#postgres
postgresql+psycopg2://<user>:<password>@<host>[:port]/<dbname>
#MSSQL
mssql+pyodbc://user:password@dsn_name
#Oracle
oracle+cx_oracle://<user>:<password>@<host>[:port]/<dbname>
flask_sqlalchemy简单使用
本案例会以flask_sqlalchemy
去讲解。下面先去安装吧。
安装
pip install flask_sqlalchemy
配置
安装好之后,需要在配置文件定义数据库的连接地址,本案例中,全部配置文件统一存放到config.py
.
....省略......
#开发环境配置文件
class DevelopemntConfig(BaseConfig):
DIALECT = 'mysql' #数据库类型
DRIVER = 'pymysql' #数据库引擎
USERNAME = 'root' #数据库用户名
PASSWORD = 'xxxxxx' #数据库密码
HOST = '192.168.1.1' #数据库主机
PORT = '3306'
DATABASE = 'eladmin' #要操作的数据库,提前创建好。
SQLALCHEMY_DATABASE_URI = "{}+{}://{}:{}@{}:{}/{}?charset=UTF8MB4".format(DIALECT, DRIVER, USERNAME, PASSWORD, HOST, PORT,DATABASE)
....省略......
在配置文件中定义好,需要实例化,并把它注册到flask
的app
中。在apps目录下__init__.py
添加如下内容:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy #引入SQLAlchemy
from config import config
import os
db = SQLAlchemy() #实例化SQLAlchemy
def create_app(config_name):
app = Flask(
__name__,
)
app.config.from_object(config[config_name])
config[config_name].init_app(app)
db.init_app(app) #把SQLAlchemy 注册到app中
return app
定义model对象
在功能模块目录中,创建一个名为models.py
,统一存放model对象。例如,本案例中在system
功能模块中创建一个models.py
,并创建如下内容:
#system/models.py
from apps import db
from datetime import datetime
class User(db.Model):
__tablename__='user'
id = db.Column(db.Integer, primary_key=True,autoincrement=True)
email = db.Column(db.String(255))
enabled = db.Column(db.Boolean)
username = db.Column(db.String(255), unique=True,nullable=False)
password = db.Column(db.String(255))
create_time = db.Column(db.DateTime,default=datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
update_time = db.Column(db.DateTime,default=datetime.now().strftime('%Y-%m-%d %H:%M:%S'),onupdate=datetime.now().strftime('%Y-%m-%d %H:%M:%S'))
model
对象已经创建好,接下来需要把model
对象更新到数据库中,这里借助flask
的第三方库flask_migrate
。执行如下命令安装:
pip install flask_migrate
安装完之后,在项目的统一入口地址,引用该库。如下:
from apps import create_app,db
from flask_script import Manager,Server
from flask_migrate import MigrateCommand,Migrate #引用flask_migrate中的两个类
from apps.system.models import *
'''
生成环境-produce
开发环境-development
测试环境-test
以上三个值通过config配置
'''
app = create_app('development')
manager = Manager(app)
migrate = Migrate(app,db) #实例化Migrate
manager.add_command('runserver',Server('0.0.0.0',port=5000))
manager.add_command('db',MigrateCommand) #定义方法
if __name__ == "__main__":
manager.run()
注意:把需要操作的model对象引入到manager中,如上述的
from apps.system.models import *
把models中的所有model对象加载到manager中。
完成以上配置之后,直接命令行操作,如下:
(venv) didiplus@DESKTOP-DOBAOAT:~/Flask_admin$ python manager.py db init
第一次使用需要先初始化,初始化完成之后,会生成一个
migrations
目录,有点类似django
。
初始化完之后,执行如下命令:
(venv) didiplus@DESKTOP-DOBAOAT:~/Flask_admin$ python manager.py db migrate
执行正确执行上述命令之后,再执行如下命令,这个命令是直接更新到数据库中的
(venv) didiplus@DESKTOP-DOBAOAT:~/Flask_admin$ python manager.py db upgrade
执行成功后,可以到数据库中,查看是否生成了表。
如果在执行中,不记得命令参数,可以执行如下命令,查看帮助文档
venv) didiplus@DESKTOP-DOBAOAT:~/Flask_admin$ python manager.py db --help
...省略....
{init,revision,migrate,edit,merge,upgrade,downgrade,show,history,heads,branches,current,stamp}
init Creates a new migration repository
revision Create a new revision file.
migrate Alias for 'revision --autogenerate'
edit Edit current revision.
merge Merge two revisions together. Creates a new migration
file
upgrade Upgrade to a later version
downgrade Revert to a previous version
show Show the revision denoted by the given symbol.
history List changeset scripts in chronological order.
heads Show current available heads in the script directory
branches Show current branch points
current Display the current revision for each database.
stamp 'stamp' the revision table with the given revision;
don't run any migrations
optional arguments:
-?, --help show this help message and exit