用的是flask_sqlalchemy刚梭,由于對pymysql有依賴泛啸,因此需要做如下聲明:
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import pymysql
pymysql.install_as_MySQLdb()
然后就是創(chuàng)建APP:
app = Flask(__name__)
然后就是定義數(shù)據(jù)表類型棒拂。數(shù)據(jù)表類型有幾個(gè)固定的格式:
class TableName(db.Model):
__tablename__ = 'tablename' #數(shù)據(jù)表的名字
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 '<Role %r>' % self.name
__tablename__:定義在數(shù)據(jù)庫中使用的表名炒俱。
__repr__:返回一個(gè)可以用來表示對象的可打印字符串。
關(guān)系型數(shù)據(jù)庫:使用關(guān)系俯艰,將不同表中的行聯(lián)系起來。因此在之前創(chuàng)建的表類中窒典,添加以下關(guān)系聲明蟆炊。
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建立關(guān)系(通道)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))#此處建立一個(gè)名為role_id的列,類型為整型瀑志,內(nèi)容為外鍵獲得的值涩搓。
這個(gè)backref和roles.id還是需要單獨(dú)拎出來說一下。
users = db.relationship('User', backref = 'role')中的users可以任意劈猪,User相當(dāng)于建立關(guān)系的對象類昧甘。說的通俗一點(diǎn),只要是User類創(chuàng)建的表战得,都有權(quán)限通過外鍵訪問‘我’充边。backref等說完db.ForeignKey再說。
db.ForeignKey('roles.id')中的roles相當(dāng)于要建立反向聯(lián)系的表名。我們之前通過Role類創(chuàng)建了名為roles的表浇冰,那么此處要訪問表中的id贬媒,自然就是roles.id了,這樣就清楚了肘习。
那么relationship中的backref又是什么意思呢际乘?backref相當(dāng)于定義了一個(gè)變量。必須通過這個(gè)變量漂佩,才能對表進(jìn)行更新脖含。看例子就明白了:
users = db.relationship('User', backref = 'role')
abc = User(username = 'John', role = 2)
數(shù)據(jù)庫操作:
創(chuàng)建表:
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.過濾器.查詢執(zhí)行函數(shù)
常用過濾器:filter() filter_by() limit() offset() order_by() group_by
常用查詢執(zhí)行函數(shù):all() first() first_or_404() get() get_or_404() count() paginate()
若無過濾器投蝉,則默認(rèn)為所有养葵。若無執(zhí)行函數(shù),則默認(rèn)為all()
使用查詢行瘩缆,可以獲得該行:
user_role = Role.query.filter_by(name = 'User').first()
通過user_role可以對行進(jìn)行修改刪除操作关拒。
所以,不講查詢先講修改刪除的都是耍流氓咳榜。
修改行
admin_role.name = 'Administrator'
db.session.add(admin_role)
db.session.commit()
刪除行
db.session.delete(admin_role)
db.session.commit()