Flask操做數據庫:mysql
須要提早安裝:flask_sqlalchemy,(pip install flask_sqlalchemy)若是鏈接的是mysql數據庫,須要安裝mysqldb驅動;(pip install flask_mysqldb)sql
一對多:數據庫
代碼以下:flask
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
class Config(object):
"""項目配置類"""
# 鏈接數據庫
# mysql://數據庫的帳號:密碼/數據庫ip地址:端口號/數據庫名稱
SQLALCHEMY_DATABASE_URI = "mysql://root:123456@127.0.0.1:3306/py18"
# 跟蹤數據庫修改操做
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 1:建立app對象
app = Flask(__name__)
# 加載項目配置
app.config.from_object(Config)
# 建立數據庫對象
db = SQLAlchemy(app)
# 定義數據庫表模型類
class User(db.Model):
# 設置表名稱,不設置默認爲類名的小寫字母(user)
__tablename__ = "users"
# 定義字段
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
# role = Role()
# role.users:該角色下有哪些用戶
# user=User()
# user.roles:該用戶屬於那種角色
# 定義關係字段relationship,這個字段在數據庫是不存在的,只是爲了方便查詢
roles = db.relationship("Role", backref="users")
def __repr__(self):
"""自定義格式化輸出"""
return "Role: %s %s" % (self.id, self.name)
# 自定義數據庫表的模型類:db.Model
class Role(db.Model):
__tablename__ = "role"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
# 定義外鍵
role_id = db.Column(db.Integer, db.ForeignKey(User.id))
def __repr__(self):
return "User:%s %s" % (self.id, self.name)
@app.route("/")
def hello_world():
return "hello world!"
if __name__ == '__main__':
# 刪除全部表
db.drop_all()
# 建立全部表
db.create_all()
app.run(debug=True)
多對多:session
代碼以下:app
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
class Config(object):
"""項目配置類"""
# 鏈接數據庫
# mysql://數據庫的帳號:密碼/數據庫ip地址:端口號/數據庫名稱
SQLALCHEMY_DATABASE_URI = "mysql://root:123456@127.0.0.1:3306/py18"
# 跟蹤數據庫修改操做
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 1:建立app對象
app = Flask(__name__)
# 加載項目配置
app.config.from_object(Config)
# 建立數據庫對象
db = SQLAlchemy(app)
# 定義第三張表
tb_user_role = db.Table("tb_user_role",
db.Column("user_id", db.Integer, db.ForeignKey("user.id")),
db.Column("role_id", db.Integer, db.ForeignKey("role.id"))
)
# 定義數據庫表模型類
class User(db.Model):
# 設置表名稱,不設置默認爲類名的小寫字母(user)
__tablename__ = "user"
# 定義字段
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
# role = Role()
# role.users:該角色下有哪些用戶
# user=User()
# user.roles:該用戶屬於那種角色
# 定義關係字段relationship,這個字段在數據庫是不存在的,只是爲了方便查詢
# TODO 添加第三張表
# secondary 指明第三張表, lazy提升性能,值返回結果對象,須要獲取數據時須要".all()"纔會展現出來
roles = db.relationship("Role",
backref="user",
secondary=tb_user_role,
lazy="dynamic")
def __repr__(self):
"""自定義格式化輸出"""
return "Role: %s %s" % (self.id, self.name)
# 自定義數據庫表的模型類:db.Model
class Role(db.Model):
__tablename__ = "role"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
# 定義外鍵
role_id = db.Column(db.Integer, db.ForeignKey(User.id))
def __repr__(self):
return "User:%s %s" % (self.id, self.name)
@app.route("/")
def hello_world():
return "hello world!"
if __name__ == '__main__':
# 刪除全部表
db.drop_all()
# 建立全部表
db.create_all()
app.run(debug=True)
//////////////////////////////////////////////////////////
數據經常使用查詢操做
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
from sqlalchemy import not_, and_, or_
class Config(object):
"""項目配置類"""
SQLAlCHEMY_DATABASE_URI = "mysql://root:123456@127.0.0,1:3306/test18"
SQLALCHEMY_TRACK_MODIFICATIONS = True
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
class Role(db.Model):
"""角色表"""
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
users = db.relationship("User", backref="role")
def __repr__(self):
return "Role:%s %s" %(self.id, self.name)
class User(db.Model):
id= db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(128), unique=True)
email = db.Column(db.String(64))
password = db.Column(db.String(64))
# 定義外鍵
role_id = db.Column(db.Integer, db.ForeignKey(Role.id))
def __repr__(self):
return "User:%s %s %s %s" %(self.id, self.name, self.email, self.role_id)
@app.route("/")
def hello_world():
return "hello world"
if __name__ == '__main__':
# 刪除全部表
db.drop_all()
# 建立全部表
db.create_all()
# 單次插入數據
ro1 = Role(name="admin")
ro2 = Role(name="user")
db.session.add_all([ro1, ro2])
db.session.commit()
us1 = User(name='wang', email='wang@163.com', password='123456', role_id=ro1.id)
us2 = User(name='zhang', email='zhang@189.com', password='201512', role_id=ro2.id)
us3 = User(name='chen', email='chen@126.com', password='987654', role_id=ro2.id)
us4 = User(name='zhou', email='zhou@163.com', password='456789', role_id=ro1.id)
us5 = User(name='tang', email='tang@itheima.com', password='158104', role_id=ro2.id)
us6 = User(name='wu', email='wu@gmail.com', password='5623514', role_id=ro2.id)
us7 = User(name='qian', email='qian@gmail.com', password='1543567', role_id=ro1.id)
us8 = User(name='liu', email='liu@itheima.com', password='867322', role_id=ro1.id)
us9 = User(name='li', email='li@163.com', password='4526342', role_id=ro2.id)
us10 = User(name='sun', email='sun@163.com', password='235523', role_id=ro2.id)
db.session.add_all([us1, us2, us3, us4, us5, us6, us7, us8, us9, us10]) db.session.commit() # 查詢全部用戶數據 User.query.all() # 查詢有多少個用戶 User.query.count() # 查詢id爲4的用戶[3種方式] User.query.get(4) # filter_by精確查詢 User.query.filter_by(id=4).first() User.query.filter(User.id == 4).first() # 查詢名字結尾字符爲g的全部數據[開始startswith/包含contains] User.query.filter(User.name.endswith("g")).all() User.query.filter(User.name.contains("g")).all() # 查詢名字不等於wang的全部數據[2種方式] User.query.filter(User.name != "wang").all() User.query.filter(not_(User.name == "wang")).all() # 查詢名字和郵箱都以"li"開頭的全部數據[2種方式] User.query.filter(User.name.startswith('li'), User.email.startswith('li')) User.query.filter(and_(User.name.startswith("li"), User.email.startswith("li"))) # 查詢password是"123456"或者"email"以"itheima.com"結尾的郵箱 User.query.filter(or_(User.password == "123456", User.email.endswith("itheima.com"))) # 查詢id爲[1,3,5,7,9]的用戶列表 # 使用in_()包含函數 User.query.filter(User.id in([1,3,5,7,9])).all() # 查詢name爲liu的數據 User.query.filter(User.name =="liu").first() # 查詢全部用戶數據,並以郵箱降序排列 User.query.filter(User.email.desc()).all() # 將全部數據分頁,每頁3個,查詢第二頁的數據 # 參數1:第幾頁的數據, 參數2:每頁多少條數據 paginate = User.query.paginate(2, 3) # 獲取當前頁面全部數據 paginate.items # 獲取當前頁碼 paginate.page # 獲取總頁數 paginate.pages app.run(debug=True)