文章目錄
數據庫 ORM 框架
什麼是ORM?
即Object-Relationl Mapping
,它的作用是在關係型數據庫和對象之間做一個映射,這樣我們在具體的操作數據庫的時候,就不需要再去和複雜的SQL語句打交道,只要像平時操作對象一樣操作它就可以了 。簡單說,ORM是一個可以使我們更簡單的操作數據庫的框架。
SQLAlchemy
是什麼?Flask-SQLAlchemy
又是什麼?
SQLAlchemy是Python語言的一個關係型數據庫框架,它提供了高層的 ORM 和底層的原生數據庫的操作,讓開發者不用直接和 SQL 語句打交道,而是通過 Python 對象來操作數據庫,在捨棄一些性能開銷的同時,大大提高了開發效率。
Flask-SQLAlchemy是一個簡化了 SQLAlchemy 框架的Flask擴展,封裝了對數據庫的基本操作。該擴展既可結合Flask框架一起使用,也可以單獨安裝使用,非常靈活。
MySql-8安裝
Windows 免安裝版
下載並解壓免安裝版,使用管理員權限啓動cmd命令行工具,cd
進入解壓目錄
-
新建配置文件
my.ini
[mysql] # 設置客戶端默認字符集 default-character-set=utf8mb4 [mysqld] default_password_lifetime=0 port=3306 # 安裝目錄 basedir=D:\MySql\mysql-8.0.16-winx64 # 數據目錄 datadir=D:\MySql\Data # 最大連接數 max_connections=200 # 允許連接失敗的次數 max_connect_errors=10 # 服務端默認使用的字符集 character-set-server=utf8mb4 # 默認的儲存引擎 default-storage-engine=INNODB # 插件認證方式 default_authentication_plugin=mysql_native_password [client] # 客戶端連接服務端時默認端口 port=3306 default-character-set=utf8mb4
修改
basedir
和datadir
爲自己實際的路徑 -
初始化數據庫
bin\mysqld --initialize --console
執行完命令,需記住命令行輸出的
root@localhost:
後面的隨機密碼 -
安裝服務
bin\mysqld --install
-
啓動服務
net start mysql
-
首次連接修改密碼
bin\mysql -u root -p
輸入直接記住的隨機密碼登錄後,執行以下命令修改密碼,將
'password'
中的值替換爲自己的想要的密碼ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
圖形化客戶端
Navicat Premium
下載並安裝 https://www.navicat.com.cn/download/navicat-premium
關於破解
建議個人學習用,公司裏不要用破解
Flask-SQLAlchemy
安裝 flask-sqlalchemy
pip install flask-sqlalchemy
安裝pymysql驅動
pip install pymysql
連接不同的數據庫,有不同的URL格式,本文以MySQL爲例
URL格式
實例:
import os
from flask_sqlalchemy import SQLAlchemy
from flask import Flask
app = Flask(__name__)
# 此處使用pymysql作爲驅動
app.config['SQLALCHEMY_DATABASE_URI'] ='mysql+pymysql://root:password@localhost:3306/my_db'
app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False
db = SQLAlchemy(app)
class User(db.Model):
# 第一個參數指定字段類型,後面設置屬性,詳見以下常用參數表
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
username = db.Column(db.String(100), nullable=False)
class Message(db.Model):
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
content = db.Column(db.Text, nullable=False)
author_id = db.Column(db.Integer, db.ForeignKey('user.id')) # 關聯外鍵(表名.字段名)
# 創建表
db.create_all()
# 插入數據
user = User(username='張三')
db.session.add(user)
# 提交
db.session.commit()
# user提交後纔會生成id,用於Message的外鍵author_id
msg = Message(content='你好,世界',author_id=user.id)
db.session.add(msg)
db.session.commit()
if __name__ == "__main__":
app.run()
SQLAlchemy常用參數
參數 | 說明 |
---|---|
primary_key | 如果設爲 True,列爲表的主鍵 |
unique | 如果設爲 True,列不允許出現重複的值 |
index | 如果設爲 True,爲列創建索引,提升查詢效率 |
nullable | 如果設爲 True,列允許使用空值;如果設爲 False,列不允許使用空值 |
default | 爲字段設置默認值 |
SQLAlchemy常用字段類型
類型 | 說明 |
---|---|
Integer | 整數 |
Float | 浮點數 |
String | 變長字符串,可設置length |
Text | 變長字符串,對較長或不限長度的字符串做了優化 |
Boolean | 布爾值 |
Date | Python中的datetime.date 日期 |
Time | Python中的 datetime.time 時間 |
DateTime | Python中的 datetime.datetime 日期和時間 |
Interval | Python中的 datetime.timedelta 時間間隔 |
Enum | 枚舉,一組字符串 |
PickleType | 任何 Python 對象 自動使用 Pickle 序列化 |
LargeBinary | 任意二進制數據 |
CRUD操作
Create
插入數據
1.實例化模型類
2.添加新創建的記錄到數據庫會話
3.提交數據庫會話
user = User(username='張三')
db.session.add(user)
db.session.commit()
Read
查詢數據
<模型類>.query.<過濾方法>.<查詢方法>
# 查詢全部
User.query.all()
# 過濾條件,並以列表形式,返回所有結果
User.query.filter_by(username="張三").all()
# 返回結果中的第一個
User.query.filter_by(username="張三").first()
過濾方法
過濾器 | 說明 |
---|---|
filter() | 把過濾器添加到原查詢上, 返回一個新查詢 |
filter_by() | 把等值過濾器添加到原查詢上, 返回一個新查詢 |
limit() | 使用是zing的值限制原查詢返回的結果數量, 返回一個新查詢 |
offset() | 偏移原查詢返回的結果, 返回一個新查詢 |
order_by() | 根據指定條件對原查詢結果進行排序, 返回一個新查詢 |
group_by() | 根據指定條件對原查詢結果進行分組, 返回一個新查詢 |
查詢方法
方法 | 說明 |
---|---|
all() | 以列表形式返回查詢的所有結果 |
first() | 返回查詢的第一個結果,如果沒有結果,則返回 None |
count() | 返回查詢結果的數量 |
get() | 返回指定主鍵對應的行,如果沒有對應的行,則返回 None |
Update
修改數據
直接賦值給模型類的字段屬性就可以改變字段值, 然後調用commit()
方法提交會話即可
user = User.query.get(1)
user.username='李四'
db.session.add(user)
db.session.commit()
Delete
刪除數據
刪除和插入類似,把add()
方法換成delete()
方法, 最後調用commit()
方法提交
user = User.query.get(1)
db.session.delete(user)
db.session.commit()
定義實體關係
定義兩張表之間的關係
from datetime import datetime
from flask_sqlalchemy import SQLAlchemy
class Post(db.Model):
id = db.Column(db.Integer, primary_key=True)
title = db.Column(db.String(80))
body = db.Column(db.Text)
pub_date = db.Column(db.DateTime)
category_id = db.Column(db.Integer, db.ForeignKey('category.id'))
# 定義表之間的關係
category = db.relationship('Category',backref=db.backref('posts', lazy='dynamic'))
class Category(db.Model):
id = db.Column(db.Integer, primary_key=True)
name = db.Column(db.String(50))
選項名 | 說明 |
---|---|
backref | 在關係的另一個模型中添加反向引用 |
primaryjoin | 明確指定兩個模型之間使用的聯結條件。只在模棱兩可的關係中需要指定. |
lazy | 指定如何加載相關記錄。 |
uselist | 如果設爲 Fales,不使用列表,而使用標量值 |
order_by | 指定關係中記錄的排序方式 |
secondary | 指定多對多關係中關係表的名字 |
secondaryjoin | SQLAlchemy 無法自行決定時,指定多對多關係中的二級聯結條件 |