我使用的数据库框架为:Flask-SQLAlchemy,它是一个Flask扩展,这个扩展包装了SQLAlchemy,支持多种数据库后台。
1.Flask-SQLAlchemy
Flask-SQLAlchemy安装:pip install flask-sqlalchemy
安装完成之后,还需要安装pymysql(pymysql是python中操作mysql的模块):pip install pymysql
在Flask-SQLAlchemy中,数据库使用URL指定,MySQL的url为:mysql://username:password@hostname/database。因为Flask-SQLAlchemy默认使用的是mysqldb,而我使用的是pymysql,所以url还需要指定pymysql,即:mysql+pymysql://username:password@hostname/database。
URL必须配置到Flask配置对像的SQLALCHEMY_DATABASE_URI中
hello.py中配置数据库:
from flask_sqlalchemy import SQLAlchemy import pymysql app = Flask(__name__) app.config["SECRET_KEY"] = "hard to guess" app.config["SQLALCHEMY_DATABASE_URI"] = "mysql+pymysql://root:123456@localhost:3306/test" app.config["SQLALCHEMY_COMMIT_ON_TEARDOWN"] = True app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = True db = SQLAlchemy(app)
2.定义模型
模型:程序使用的持久化实体。模型一般是一个Python类,类中的属性对应数据库中的列。
如:数据库test有两个表:role和users
role表中有两个属性,分别是id 和 name,它存储的是可用的用户角色。
users表中有四个属性,分别为:id username password role_id,其中role_id为外键,关联到role表中。它存储的是用户信息。
hello.py中定义模型:
class Role(db.Model): __tablename__ = "role" id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(100)) def __repr__(self): return '<Role %r>' % self.name users = db.relationship('User', backref="role") class User(db.Model): __tablename__ = "users" id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(100)) def __repr__(self): return '<User %r>' % self.username role_id = db.Column(db.Integer, db.ForeignKey('role.id'))
__table__name变量指的是数据库中使用的表名。
3.关系
users = db.relationship('User', backref="role") 和 role_id = db.Column(db.Integer, db.ForeignKey('role.id'))这两个语句说明了这两个表的关系。
db.relationship()中backref参数向User模型中添加一个role属性,从而定义反向关系。这一属性可替代role_id访问Role模型,此时获取的是模型对象,而不是外键的值。
大多数情况下,db.relationship()都能自行找到关系中的外键,若无法决定外键,我们就要自己为它提供额外参数来确定所使用的外键。