在项目中都会使用到数据库的,Flask本身不具备数据库引擎,但是它有丰富的第三方库,支持不同的数据库,比如,MySQL、SQLite、postgres、Oracle。其中flask_sqlalchemy是对SQLAlchemy做了一层封装,可以在flask中使用更加方便。其原理还是SQLAlchemy这台东西。

SQLAlchemy框架组件介绍

sqlalchemy版本兼容 sqlalchemy支持哪些数据库_mysql


组成部分:

  • 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)
....省略......

在配置文件中定义好,需要实例化,并把它注册到flaskapp中。在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

执行成功后,可以到数据库中,查看是否生成了表。

sqlalchemy版本兼容 sqlalchemy支持哪些数据库_orm_02

如果在执行中,不记得命令参数,可以执行如下命令,查看帮助文档

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