# 轉載請留言聯系
-
ORM 是什么?
ORM,Object-Relation Mapping。意思就是對象-關系映射。ORM 主要實現模型對象到關系數據庫數據的映射。
優點 :
- 只需要面向對象編程, 不需要面向數據庫編寫代碼.
- 對數據庫的操作都轉化成對類屬性和方法的操作.
- 不用編寫各種數據庫的
sql語句
.
- 實現了數據模型與數據庫的解耦, 屏蔽了不同數據庫操作上的差異.
- 不在關注用的是
mysql
、oracle
...等. - 通過簡單的配置就可以輕松更換數據庫, 而不需要修改代碼.
- 不在關注用的是
缺點 :
- 相比較直接使用SQL語句操作數據庫,有性能損失.
- 根據對象的操作轉換成SQL語句,根據查詢的結果轉化成對象, 在映射過程中有性能損失.
-
Flask-SQLAlchemy的安裝
SQLAlchemy是一個關系型數據庫框架,它提供了高層的 ORM 和底層的原生數據庫的操作。flask-sqlalchemy 是一個簡化了 SQLAlchemy 操作的 flask 擴展。
- 安裝 flask-sqlalchemy
pip3 install flask-sqlalchemy
- 如果連接的是 mysql 數據庫,需要安裝 mysqldb 驅動
pip3 install flask-mysqldb
- 如果第二步安裝出現錯誤,一般是沒有安裝 libmysqld-dev 造成的
sudo apt-get install libmysqld-dev
-
Flask-SQLAlchemy 連接數據庫以及創建表
from flask import Flask from flask_sqlalchemy import SQLAlchemy app=Flask(__name__) # 連接數據庫 app.config['SQLALCHEMY_DATABASE_URI'] = '數據庫類型://數據庫用戶名:數據庫密碼@數據庫地址:數據庫端口/數據庫名字' # 設置是否跟蹤數據庫的修改情況,一般不跟蹤 app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False # 數據庫操作時是否顯示原始SQL語句,一般都是打開的,因為我們后台要日志 app.config['SQLALCHEMY_ECHO'] = True # 實例化orm框架的操作對象,后續數據庫操作,都要基於操作對象來完成 db = SQLAlchemy(app) # 聲明模型類 class Role(db.Model): __tablename__ = "my_table" #設置表名 id = db.Column(db.INTEGER,primary_key=True) 設置字段,以及屬性 name = db.Column(db.String(10),nullable=False) @app.route("/") def index(): return "hello" if __name__ == '__main__': db.create_all() # 創建當前應用中聲明的所有模型類對應的數據表,db.drop_all()是刪除表 app.run(debug=True)
數據庫的其他配置
名字 | 備注 |
---|---|
SQLALCHEMY_DATABASE_URI | 用於連接的數據庫 URI 。例如:sqlite:////tmp/test.dbmysql://username:password@server/db |
SQLALCHEMY_BINDS | 一個映射 binds 到連接 URI 的字典。更多 binds 的信息見用 Binds 操作多個數據庫。 |
SQLALCHEMY_ECHO | 如果設置為Ture, SQLAlchemy 會記錄所有 發給 stderr 的語句,這對調試有用。(打印sql語句) |
SQLALCHEMY_RECORD_QUERIES | 可以用於顯式地禁用或啟用查詢記錄。查詢記錄 在調試或測試模式自動啟用。更多信息見get_debug_queries()。 |
SQLALCHEMY_NATIVE_UNICODE | 可以用於顯式禁用原生 unicode 支持。當使用 不合適的指定無編碼的數據庫默認值時,這對於 一些數據庫適配器是必須的(比如 Ubuntu 上 某些版本的 PostgreSQL )。 |
SQLALCHEMY_POOL_SIZE | 數據庫連接池的大小。默認是引擎默認值(通常 是 5 ) |
SQLALCHEMY_POOL_TIMEOUT | 設定連接池的連接超時時間。默認是 10 。 |
SQLALCHEMY_POOL_RECYCLE | 多少秒后自動回收連接。這對 MySQL 是必要的, 它默認移除閑置多於 8 小時的連接。注意如果 使用了 MySQL , Flask-SQLALchemy 自動設定 這個值為 2 小時。 |
連接其他數據庫
完整連接 URI 列表請跳轉到 SQLAlchemy 下面的文檔 (Supported Databases) 。
常用的SQLAlchemy字段類型
類型名 | python中類型 | 說明 |
---|---|---|
Integer | int | 普通整數,一般是32位 |
SmallInteger | int | 取值范圍小的整數,一般是16位 |
BigInteger | int或long | 不限制精度的整數 |
Float | float | 浮點數 |
Numeric | decimal.Decimal | 普通整數,一般是32位 |
String | str | 變長字符串 |
Text | str | 變長字符串,對較長或不限長度的字符串做了優化 |
Unicode | unicode | 變長Unicode字符串 |
UnicodeText | unicode | 變長Unicode字符串,對較長或不限長度的字符串做了優化 |
Boolean | bool | 布爾值 |
Date | datetime.date | 時間 |
Time | datetime.datetime | 日期和時間 |
LargeBinary | str | 二進制文件 |
常用的SQLAlchemy列選項
選項名 | 說明 |
---|---|
primary_key | 如果為True,代表表的主鍵 |
unique | 如果為True,代表這列不允許出現重復的值 |
index | 如果為True,為這列創建索引,提高查詢效率 |
nullable | 如果為True,允許有空值,如果為False,不允許有空值 |
default | 為這列定義默認值 |