Flask中的数据库
Flask本身不支持数据库,对使用的数据库插件自由选择。
数据库被划分为两大类,遵循关系模型的一类是关系数据库,另外的则是非关系数据库,简称NoSQL,表现在它们不支持流行的关系查询语言SQL。
使用Flask-SQLAlchemy管理数据库
Flask-SQLAlchemy是一个Flask扩展,简化了在Flask程序中使用SQLAlchemy的操作。SQLAlchemy是一个很强大的关系型数据库框架,支持包含MySQL、PostgreSQL和SQLite在内的很多数据库软件。
- 安装
pip install flask-sqlalchemy
- 常见数据库URL格式
mysql mysql://username:password@hostname/database
postgres postgresql://username:password@hostname/database
sqlite sqlite:///absolute/path/to/database
- 配置数据库
# config.py
import os
basedir = os.path.abspath(os.path.dirname(__file__))
class Config(object):
SECRET_KEY = os.environ.get('SECRET_KEY') or 'marksecret'
SQLALCHEMY_DATABASE_URI = os.environ.get('DATABASE_URL') or \
'mysql://root:root@localhost/flask' + os.path.join(basedir, 'app.db')
SQLALCHEMY_TRACk_MODIFICATIONS = True
SQLALCHEMY_COMMIT_TEARDOWN = True
# __init__.py变更后
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app,db)
from app import routes,models
模型
定义数据库中一张表及其字段的类,通常叫做数据模型。ORM(SQLAlchemy)会将类的实例关联到数据库表中的数据行,并翻译相关操作。
mysql> desc user;
+---------------+--------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+-------+
| id | int(11) | NO | PRI | NULL | |
| username | varchar(64) | YES | | NULL | |
| email | varchar(120) | YES | | NULL | |
| password_hash | varchar(128) | YES | | NULL | |
+---------------+--------------+------+-----+---------+-------+
代码实现
# models.py
from app import db
class User(db.Model):
id =db.Column(db.String(64), primary_key=True,index=True, unique=True)
username = db.Column(db.String(64), index=True, unique=True)
email = db.Column(db.String(120), index=True, unique=True)
password_hash = db.Column(db.String(128))
def __repr__(self):
return '<User {}>'.format(self.username)
测试
>>> from app.models import User
>>> u = User(username='mark',email='[email protected]')
>>> u
<User mark>
>>>
关系
关系数据库使用关系把不同表中的行联系起来。一旦建立了关系,数据库就可以在查询中展示它。
roles表存储所有可用的用户角色,每个角色使用一个唯一的id值(即表的主键)进行标识。users表除了id主键之外,role_id是外键,引用角色的id,通过这种方式为每个用户指定角色。
示例代码
# hello.py
class Role(db.Model):
#...
users = db.relationship('User',backref='role')
class User(db.Model):
#...
role_id = db.Column(db.Integer,db.ForeignKey('role.id'))
关系使用users表中的外键连接了两行。添加到user模型中的role_id被定义为外键,就是这个外键建立起了关系。传给db.ForeignKey()的参数role_id表明,这列的值是roles表中的id值
db.relationship()第一个参数表明这个关系的另一端是哪个模型。backref参数向user模型中添加了一个role属性,从而定义反向关系。这一属性可替代role_id访问role模型,此时获取的是模型对象,而不是外键的值。
数据库操作
- 增
- 查
- 删
改
在视图函数中操作数据库
python shell