Flask數據庫——SQLAlchemy

1、Flask-SQLAlchemy初始化

SQLAlchemy作為操作關係型數據庫的對象關係映射框架,必需要進行必要的初始化配置後才能使用。在Flask-SQLAlchemy中,插入、修改、刪除操作均由數據庫會話管理,會話用db.session表示。在準備把數據寫入數據庫前,要先將數據添加到會話中,然後調用commit()方法提交會話。在python3中數據庫的配置文件如下:

<code>### config.py
USERNAME = 'root' # 登錄賬號
PASSWORD = 'root' # 登錄密碼
HOST = '127.0.0.1' # 設置主機地址
PORT = '3306' # 設置端口號
DATABASE = 'db_demol' # 設置訪問數據庫名稱
# 創建數據庫連接URL
DB_URL = 'MySQL+pyMySQL://{}:{}@{}:/{}?charset=utf8'.format(USERNAME,PASSWORD,HOST,PORT,DATABASE)
SQLALCHEMY_DATABASE_URL = DB_URL
# 動態追蹤修改設置,如若未設置會出現警告
SQLALCHEMY_TRACK_MODIFICATIONS = False
# 查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True/<code>
<code>### 初始化實例  db_demo1.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
app = 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)/<code>

2、Flask-SQLAlchemy 模型與表映射方法

<code>### 使用Flask-SQLArchemy框架創建數據庫表  app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from 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)/<code>

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 數據添加

<code>### 使用Flask-SQLArchemy框架創建數據庫表  app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from 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)/<code>

3.2 數據查詢

<code>### 查詢數據 

@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 '查詢數據成功'/<code>

3.3 數據修改

<code>### 修改數據
@app.route('/select')
def select():
result = Book.query.filter(Book.id == '1').first()
result.price = 130
db.session.commit()
return '修改數據成功'/<code>

3.4 數據刪除

<code>### 刪除數據
@app.route('/select')
def select():
result = Book.query.filter(Book.id == '5').first()
db.session.delete(result)
db.session.commit()
return '刪除數據成功'/<code>

4、使用Flask-SQLAlchemy 創建一對一的關係表

數據庫實體之間有3種關聯關係:一對一,一對多和多對多。一個學生只有一個身份證號碼,構成了一對一關係;一個班級有多個學生,構成了一對多的關係;一個學生可以選修多門課程,一門課程對應多門課程,學生與課程之間就構成了多對多的關係。

<code>### 使用Flask-SQLArchemy創建一對一關係  app.py 

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from 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)/<code>

5、使用Flask-SQLAlchemy創建一對多的關係表

<code>### 使用Flask-SQLArchemy創建一對多關係  app.py
from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from 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)/<code>

6、使用Flask-SQLAlchemy創建多對多的關係表

處理多對多表問題時,解決方法是添加第3張表,這個表稱為關聯表或中間表。數據庫中的多對多關聯關係一般需要採用中間表的方式處理,將多對多轉化為兩個一對多。

<code>### 使用Flask-SQLArchemy創建多對多關係  app.py 

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
import config
from 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)/<code>


分享到:


相關文章: