1、Flask-SQLAlchemy初始化
SQLAlchemy作為操作關係型資料庫的物件關係對映框架,必需要進行必要的初始化配置後才能使用。在Flask-SQLAlchemy中,插入、修改、刪除操作均由資料庫會話管理,會話用db.session表示。在準備把資料寫入資料庫前,要先將資料新增到會話中,然後呼叫commit()方法提交會話。在python3中資料庫的配置檔案如下:
### config.pyUSERNAME = 'root' # 登入賬號PASSWORD = 'root' # 登入密碼HOST = '127.0.0.1' # 設定主機地址PORT = '3306' # 設定埠號DATABASE = 'db_demol' # 設定訪問資料庫名稱# 建立資料庫連線URLDB_URL = 'MySQL+pyMySQL://{}:{}@{}:/{}?charset=utf8'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE)SQLALCHEMY_DATABASE_URL = DB_URL# 動態追蹤修改設定,如若未設定會出現警告SQLALCHEMY_TRACK_MODIFICATIONS = False# 查詢時會顯示原始SQL語句SQLALCHEMY_ECHO = True
### 初始化例項 db_demo1.pyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport configapp = Flask(__name__)app.config.from_object(config) # 初始化配置檔案# 初始化一個物件db = SQLAlchemy(app)db.create_all() # 建立資料庫@app.route('/')def index(): return 'index'if __name__ == '__main__': app.run(debug=True)
2、Flask-SQLAlchemy 模型與表對映方法
### 使用Flask-SQLArchemy框架建立資料庫表 app.pyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport configfrom datetime import datetime # 匯入時間模組app = Flask(__name__)app.config.from_object(config) # 初始化配置檔案# 初始化一個數據庫連線物件db = SQLAlchemy(app)class Book(db.Model): __tablename__ == 'book' # 表名 id = db.Column(db.Integer, primary_key = True, autoincrement = True) # id號 title = db.Column(db.String(50), nullable = False) # 書名,不能為空 price = db.Column(db.String(50), nullable = False) # 價格,不能為空 publish_office = db.Column(db.String(100),nullable = False) # 出版社,不能為空 isbn = db.Colume(db.String(50), nullable = False) # isbn號 storage_time = db.Column(db.Datetime, default = datetime.now) # 入庫時間 db.create_all() # 建立資料庫@app.route('/')def index(): return 'index'if __name__ == '__main__': app.run(debug=True)
Flask-SQLAlchemy常用資料型別
型別名稱 python型別 描述
Integer int 整型,通常為32位,隱射到資料庫中為int型別
SmallInteger int 短整型,通常為16位,隱射到資料庫中為int型別
BigInteger int或long 長整型,精度不受限制,隱射到資料庫中為int型別
Float float 浮點數,對映到資料庫中是float型別
Numeric decimal 定點數
String str 可變長度字串,對映到資料庫中是varchar型別
Text str 可變長度字串,適合大量文字
Unicode unicode 可變長度Unicode字串
Boolean bool 布林值,對映到資料庫中是tinyint型別
Date datetime.data 日期型別
Time datetime.time 時間型別
Datetime datatime.datetime 日期時間型別
Interval Datetime.datetime 時間間隔型別
Enum str 字元列表
LargeBinary str 二進位制
Flask-SQLAlchemy宣告可選引數
可選引數 描述
Primary_key 如果為True,該列為表的主鍵
unique 如果為True,該列不允許有相同的值
index 如果為True,為提高查詢效率,為該列建立索引
nullable 如果為True, 該列允許為空
default 定義該列的預設值
3、資料的增、刪、改、查3.1 資料新增
### 使用Flask-SQLArchemy框架建立資料庫表 app.pyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport configfrom datetime import datetime # 匯入時間模組app = Flask(__name__)app.config.from_object(config) # 初始化配置檔案# 初始化一個數據庫連線物件db = SQLAlchemy(app)class Book(db.Model): # 建立表 __tablename__ == 'book' # 表名 id = db.Column(db.Integer, primary_key = True, autoincrement = True) # id號 title = db.Column(db.String(50), nullable = False) # 書名,不能為空 publish_office = db.Column(db.String(100),nullable = False) # 出版社,不能為空 price = db.Column(db.String(50), nullable = False) # 價格,不能為空 isbn = db.Colume(db.String(50), nullable = False) # isbn號 storage_time = db.Column(db.Datetime, default = datetime.now) # 入庫時間 db.create_all() # 建立資料庫### 新增資料@app.route('/add')def add(): book1 = Book(title = 'ppython基礎教程', publish_office = '清華大學出版社', price = '68.30', isbn = '9787115466419') # 定義book1物件 db.session.add(book1) db.session.commit() return '新增資料成功'@app.route('/')def index(): return 'index'if __name__ == '__main__': app.run(debug=True)
3.2 資料查詢
### 查詢資料@app.route('/select')def select(): result_1 = Book.query.filter(Book.id == '1').first() result_2 = Book.query.filter(Book.publish_office == '人民郵電出版社').all() print(result_1) print(result_2) return '查詢資料成功'
3.3 資料修改
### 修改資料@app.route('/select')def select(): result = Book.query.filter(Book.id == '1').first() result.price = 130 db.session.commit() return '修改資料成功'
3.4 資料刪除
### 刪除資料@app.route('/select')def select(): result = Book.query.filter(Book.id == '5').first() db.session.delete(result) db.session.commit() return '刪除資料成功'
4、使用Flask-SQLAlchemy 建立一對一的關係表資料庫實體之間有3種關聯關係:一對一,一對多和多對多。一個學生只有一個身份證號碼,構成了一對一關係;一個班級有多個學生,構成了一對多的關係;一個學生可以選修多門課程,一門課程對應多門課程,學生與課程之間就構成了多對多的關係。
### 使用Flask-SQLArchemy建立一對一關係 app.pyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport configfrom datetime import datetime # 匯入時間模組app = Flask(__name__)app.config.from_object(config) # 初始化配置檔案# 初始化一個數據庫連線物件db = SQLAlchemy(app)# 定義使用者表class User(db.Model): # 定義表 __tablename__ == 'user' # 表名 id = db.Column(db.Integer, primary_key = True, autoincrement = True) # id號 username = db.Column(db.String(50), nullable = False) # 使用者名稱,不能為空 password = db.Column(db.String(50), nullable = False) # 密碼,不能為空 phone = db.Column(db.String(11),nullable = False) # 電話號碼,不能為空 email = db.Colume(db.String(30), nullable = False) # 郵箱 reg_time = db.Column(db.Datetime, default = datetime.now) # 註冊時間 # 定義借書證表class Lib_card(db.Model): __tablename__ == 'lib_card' # 表名 id = db.Column(db.Integer, primary_key = True, autoincrement = True) # id號 card_id = db.Column(db.Integer, nullable = False) # 借書證id,不能為空 borrow_reg_time = db.Column(db.Datetime, default = datetime.now) # 證件辦理時間,不能為空 user_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 不能為空 users = db.relationship('User', backref = db.backref('cards'), uselist = False)db.create_all() # 建立資料庫### 新增資料@app.route('/add')def add(): # 新增兩條使用者資料 user1 = User(username = '張三', password = 'zhangsan', phone = '18788888888', email = '[email protected]') # user1物件 user2 = User(username = '李四', password = 'lisi', phone = '18766666666', email = '[email protected]') # user2物件 db.session.add(user1) db.session.add(user2) # 新增兩條借書證資料 card1 = Lib_card(card_id = '2180501001', user_id = '1') # card1物件 card2 = Lib_card(card_id = '2180501002', user_id = '2') # card2物件 db.session.add(card1) db.session.add(card2) db.session.commit() return '新增資料成功'@app.route('/')def index(): return 'index'if __name__ == '__main__': app.run(debug=True)
5、使用Flask-SQLAlchemy建立一對多的關係表### 使用Flask-SQLArchemy建立一對多關係 app.pyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport configfrom datetime import datetime # 匯入時間模組app = Flask(__name__)app.config.from_object(config) # 初始化配置檔案# 初始化一個數據庫連線物件db = SQLAlchemy(app)# 定義使用者表# 定義模型類-作者類class Writer(db.Model): # 定義表 __tablename__ == 'writer' # 表名 id = db.Column(db.Integer, primary_key = True) # id號 name = db.Column(db.String(50), nullable = False) # 作者名,不能為空 # 設定relationship屬性方法,建立模型關係,第一個引數為多方模型的類名,新增backref可以實現多對一的反向查詢 books = db.relationship('Book', backref = 'writers') # 定義模型類-圖書類class Book(db.Model): __tablename__ == 'books' # 表名 id = db.Column(db.Integer, primary_key = True) # id號 title = db.Column(db.String(50), nullable = False) # 書名,不能為空 publish_office = db.Column(db.String(100),nullable = False) # 出版社,不能為空 isbn = db.Colume(db.String(50), nullable = False) # isbn號 writer_id = db.Column(db.Integer, db.ForeignKey('wrieter.id'))db.create_all() # 建立表### 新增資料@app.route('/add')def add(): # 新增兩條作者資料 user1 = Writer(name = '張三') # writer1物件 user2 = Writer(name = '李四') # writer2物件 db.session.add(user1) db.session.add(user2) # 新增兩條圖書資料 book1 = Lib_card(title = '名師帶你學習', publish_office = '清華大學出版社',isbn = '26567585664', writer_id = '1') # book1物件 book2 = Lib_card(title = '我要奮鬥', publish_office = '清華大學出版社',isbn = '45217585361', writer_id = '1') # book2物件 book3 = Lib_card(title = '我要努力', publish_office = '人民郵電出版社',isbn = '36897983261', writer_id = '2') # book3物件 db.session.add(book1) db.session.add(book2) db.session.add(book3) db.session.commit() return '新增資料成功'@app.route('/')def index(): return 'index'if __name__ == '__main__': app.run(debug=True)
6、使用Flask-SQLAlchemy建立多對多的關係表處理多對多表問題時,解決方法是新增第3張表,這個表稱為關聯表或中間表。資料庫中的多對多關聯關係一般需要採用中間表的方式處理,將多對多轉化為兩個一對多。
### 使用Flask-SQLArchemy建立多對多關係 app.pyfrom flask import Flaskfrom flask_sqlalchemy import SQLAlchemyimport configfrom datetime import datetime # 匯入時間模組app = Flask(__name__)app.config.from_object(config) # 初始化配置檔案# 初始化一個數據庫連線物件db = SQLAlchemy(app)# 定義關聯表book_tag = db.Table('book_tag', db.Column('book_id', db.Integer, db.ForeignKey('book.id'),primary_key = True), db.Column('tag_id', db.Integer, db.ForeignKey('shelfing.id'), primary_Key = True))# 定義模型類-圖書類class Book(db.Model): # 定義表 __tablename__ == 'book' # 表名 id = db.Column(db.Integer, primary_key = True, autoincrement = True) # id號 name = db.Column(db.String(50), nullable = False) # 定義書名,不能為空 # 設定relationship屬性方法,建立模型關係,第一個引數為多方模型的類名,secondary代表中間表,新增backref可以實現多對一的反向查詢 tags = db.relationship('Shelfing', secondary = book_tag, backref =db.backref('books')) # 定義模型類-圖書上架的標籤類class Shelfing(db.Model): __tablename__ == 'shelfing' # 表名 id = db.Column(db.Integer, primary_key = True, nullable = False) # id號 tag = db.Column(db.String(50), nullable = False) # 定義tag欄位,不能為空db.create_all() # 建立表@app.route('/')def index(): return 'index'if __name__ == '__main__': app.run(debug=True)