用的是flask_sqlalchemy,由于对pymysql有依赖,因此需要做如下声明:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
然后就是创建APP:
app = Flask(__name__)
然后就是定义数据表类型。数据表类型有几个固定的格式:
class TableName(db.Model):
__tablename__ = 'tablename' #数据表的名字
id = db.Column(db.Integer, primary_key = True)
name1 = db.Column(db.String(64), unique = True)
name2 = db.Column(db.Float, unique = True)
#...
def __repr__(self):
return '' % self.name
__tablename__:定义在数据库中使用的表名。
__repr__:返回一个可以用来表示对象的可打印字符串。
关系型数据库:使用关系,将不同表中的行联系起来。因此在之前创建的表类中,添加以下关系声明。
class Role(db.Model):
#...
users = db.relationship('User', backref = 'role')
class User(db.Model):
#...
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
users = db.relationship('User', backref = 'role')#用来声明与User建立关系(通道)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))#此处建立一个名为role_id的列,类型为整型,内容为外键获得的值。
这个backref和roles.id还是需要单独拎出来说一下。
users = db.relationship('User', backref = 'role')中的users可以任意,User相当于建立关系的对象类。说的通俗一点,只要是User类创建的表,都有权限通过外键访问‘我’。backref等说完db.ForeignKey再说。
db.ForeignKey('roles.id')中的roles相当于要建立反向联系的表名。我们之前通过Role类创建了名为roles的表,那么此处要访问表中的id,自然就是roles.id了,这样就清楚了。
那么relationship中的backref又是什么意思呢?backref相当于定义了一个变量。必须通过这个变量,才能对表进行更新。看例子就明白了:
users = db.relationship('User', backref = 'role')
abc = User(username = 'John', role = 2)
数据库操作:
创建表:
db.crease_all()
插入行
admin_role = Role(name = 'Admin')
mod_role = Role(name = 'Moderator')
user_role = Role(name = 'User')
user_john = User(username = 'john', role = admin_role)
user_susan = User(username = 'susan', role = user_role)
user_david = User(username = 'david', role = user_role)
db.session.add_all([admin_role, mod_role, user_role, user_john, user_susan, user_david])
db.session.commit()
查询行:
Role.query.过滤器.查询执行函数
常用过滤器:filter() filter_by() limit() offset() order_by() group_by
常用查询执行函数:all() first() first_or_404() get() get_or_404() count() paginate()
若无过滤器,则默认为所有。若无执行函数,则默认为all()
使用查询行,可以获得该行:
user_role = Role.query.filter_by(name = 'User').first()
通过user_role可以对行进行修改删除操作。
所以,不讲查询先讲修改删除的都是耍流氓。
修改行
admin_role.name = 'Administrator'
db.session.add(admin_role)
db.session.commit()
删除行
db.session.delete(admin_role)
db.session.commit()