Flask開發之數據庫 (SQLAlchemy)的配置以及增刪改查
前言:SQLAlchemy是一個關係型數據庫框架,它提供了高層的ORM和底層的原生數據庫的操作。flask-sqlalchemy是一個簡化了SQLAlchemy操作的flask擴展。
1.在Flask中配置SQLAlchemy
1 安裝flask-sqlalchemy
pip install flask-sqlalchemy
2 安裝flask-mysqldb
pip install flask-mysqldb
3 在代碼中的配置:
class Config(object):
"""配置參數"""
# sqlalchemy的配置參數
SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/flask_demo"
# 設置sqlalchemy自動更跟蹤數據庫
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 設置每次請求結束後會自動提交數據庫中的改動
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
# 查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True
app.config.from_object(Config)
db = SQLAlchemy(app)
2.常用的SQLAlchemy字段類型
3.常用的SQLAlchemy列選項
4.常用的SQLAlchemy關係選項
5.在視圖函數中定義模型類
注意:需要在命令行操作
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
app = Flask(__name__)
class Config(object):
"""配置參數"""
# sqlalchemy的配置參數
SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/flask_demo"
# 設置sqlalchemy自動更跟蹤數據庫
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 設置每次請求結束後會自動提交數據庫中的改動
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
# 查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True
app.config.from_object(Config)
db = SQLAlchemy(app)
# 定義數據庫的模型
class Author(db.Model):
"""作者"""
__tablename__ = "author"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
books = db.relationship("Book", backref="author")
class Book(db.Model):
"""書籍"""
__tablename__ = "book"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey("author.id"))
if __name__ == '__main__':
db.drop_all() #第一次執行的時候操作
db.create_all()#創建表
# app.run(debug=True)
6.數據庫的增刪改查
1 常用的SQLAlchemy查詢過濾器
2.常用的SQLAlchemy查詢執行器
3 插入一條或者多條數據
def add_one():
"""添加單個數據"""
user1 = Author(name="fly1")
db.session.add(user1)
db.session.commit()
bk_user1 = Book(name='fly自傳', author_id=user1.id)
db.session.add(bk_user1)
db.session.commit()
def add_many():
"""添加多個數據"""
au_xi = Author(name='我喫西紅柿')
au_qian = Author(name='蕭潛')
au_san = Author(name='唐家三少')
db.session.add_all([au_xi, au_qian, au_san])
db.session.commit()
bk_xi = Book(name='吞噬星空', author_id=au_xi.id)
bk_xi2 = Book(name='寸芒', author_id=au_qian.id)
bk_qian = Book(name='飄渺之旅', author_id=au_qian.id)
bk_san = Book(name='冰火魔廚', author_id=au_san.id)
db.session.add_all([bk_xi, bk_xi2, bk_qian, bk_san])
db.session.commit()
4.刪除數據
def delete():
"""刪除數據"""
author = Author.query.filter_by(name="唐家三少").first()
db.session.delete(author)
db.session.commit()
5.修改數據
def update():
"""更新數據"""
book = Book.query.filter_by(name="吞噬星空").first()
book.name = '吞噬星空2'
db.session.commit()
Author.query.filter_by(name='zhang').update({'name': 'li'})
pass
6.查詢數據
def query():
"""查詢數據"""
# r1 = Book.query.all() #查詢所有
# r2 = Book.query.filter_by(name="吞噬星空").all() #根據條件查詢
r3 = Book.query.filter_by(name="吞噬星空").first() # 根據條件查詢 第一個
# r4 = Book.query.first() #查詢第一個
# r5 = Book.query.filter(Author.name.endswith('g')).all() #模糊查詢
print(r3)
print(type(r3))
7.數據庫遷移
在開發過程中,需要修改數據庫模型,這樣就可以使用Flask-Migrate來進行數據的遷移。
1 安裝Flask-Migrate和flask_script
pip install flask-migrate
pip install flask_script
2 添加遷移代碼
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate,MigrateCommand
from flask_script import Shell,Manager
app = Flask(__name__)
manager = Manager(app)
class Config(object):
"""配置參數"""
# sqlalchemy的配置參數
SQLALCHEMY_DATABASE_URI = "mysql://root:[email protected]:3306/flask_demo"
# 設置sqlalchemy自動更跟蹤數據庫
SQLALCHEMY_TRACK_MODIFICATIONS = True
# 設置每次請求結束後會自動提交數據庫中的改動
SQLALCHEMY_COMMIT_ON_TEARDOWN = True
# 查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True
app.config.from_object(Config)
db = SQLAlchemy(app)
#第一個參數是Flask的實例,第二個參數是Sqlalchemy數據庫實例
migrate = Migrate(app,db)
#manager是Flask-Script的實例,這條語句在flask-Script中添加一個db命令
manager.add_command('db',MigrateCommand)
# 定義數據庫的模型
class Author(db.Model):
"""作者"""
__tablename__ = "author"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(32), unique=True)
books = db.relationship("Book", backref="author")
class Book(db.Model):
"""書籍"""
__tablename__ = "book"
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(64), unique=True)
author_id = db.Column(db.Integer, db.ForeignKey("author.id"))
if __name__ == '__main__':
manager.run()
3 創建遷移倉庫
python app.py db init
4 創建遷移腳本
python app.py db migrate -m ‘initial migration’
5 更新數據庫
python app.py db upgrade
6 回退數據庫
python database.py db downgrade 版本號
結束!!!