ORM
Object-Relation-Mapping,意為對象-關(guān)系映射。主要實現(xiàn)模型對象到關(guān)系數(shù)據(jù)庫的映射
ORM的優(yōu)點:
- 只需要面向?qū)ο缶幊?,不需要面向?shù)據(jù)庫編寫代碼。
1.對數(shù)據(jù)庫的操作都轉(zhuǎn)化成對類屬性和方法的操作
2.不用編寫各種數(shù)據(jù)測sql語句
- 實現(xiàn)了數(shù)據(jù)模型與數(shù)據(jù)庫的解耦,屏蔽了不同數(shù)據(jù)庫操作上的差異。
1.不在需要關(guān)注當(dāng)前項目使用的是哪種數(shù)據(jù)庫
2.通過簡單的配置就可以輕松的
ORM的缺點:
- 相比較直接使用SQL語句操作數(shù)據(jù)庫,有性能損失。
- 根據(jù)對象的操作轉(zhuǎn)換成SQL語句,根據(jù)查詢的結(jié)果轉(zhuǎn)化成對象,在映射過程中有性能損失。
Flask-SQLAlchemy
flask默認(rèn)提供模型操作,但是并沒有提供ORM,所以一般開發(fā)的時候我們會采用flask-SQLAlchemy模塊來實現(xiàn)ORM操作。
SQLAlchemy是一個關(guān)系型數(shù)據(jù)庫框架,它提供了高層的 ORM 和底層的原生數(shù)據(jù)庫的操作。flask-sqlalchemy 是一個簡化了 SQLAlchemy 操作的flask擴(kuò)展。SQLAlchemy: https://www.sqlalchemy.org/
安裝flask-sqlalchemy
pip install flask-sqlalchemy
如果連接的是 mysql 數(shù)據(jù)庫,需要安裝 mysqldb 驅(qū)動
pip install flask-mysqldb
安裝flask-mysqldb時,注意
安裝 flask-mysqldb的時候,python底層依賴于一個底層的模塊 mysql-client模塊
如果沒有這個模塊,則會報錯如下:
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-install-21hysnd4/mysqlclient/
解決方案:
apt-get install libmysqlclient-dev python3-dev
運(yùn)行上面的安裝命令如果報錯:
dpkg 被中斷,您必須手工運(yùn)行 ‘sudo dpkg --configure -a’ 解決此問題。
則根據(jù)提示執(zhí)行命令以下命令,再次安裝mysqlclient
sudo dpkg --configure -a
apt-get install libmysqlclient-dev python3-dev
解決了mysqlclient問題以后,重新安裝 flask-mysqldb即可。
pip install flask-mysqldb
數(shù)據(jù)庫連接設(shè)置
在 Flask-SQLAlchemy 中,數(shù)據(jù)庫使用URL指定,而且程序使用的數(shù)據(jù)庫必須保存到Flask配置對象的 SQLALCHEMY_DATABASE_URI 鍵中
config.py,配置文件代碼:
class Config(object):
DEBUG = True
SECRET_KEY = "*(%#4sxcz(^(#$#8423"
# 數(shù)據(jù)庫鏈接配置:
#數(shù)據(jù)類型://登錄賬號:登錄密碼@數(shù)據(jù)庫主機(jī)IP:數(shù)據(jù)庫訪問端口/數(shù)據(jù)庫名稱
SQLALCHEMY_DATABASE_URI = "mysql://root:123@127.0.0.1:3306/flask_students"
其他設(shè)置:
# 動態(tài)追蹤修改設(shè)置,如未設(shè)置只會提示警告
SQLALCHEMY_TRACK_MODIFICATIONS = True
#查詢時會顯示原始SQL語句
SQLALCHEMY_ECHO = True
配置完成需要去 MySQL 中創(chuàng)建項目所使用的數(shù)據(jù)庫
$ mysql -uroot -p123
mysql > create database flask_students charset=utf8mb4;
常用的SQLAlchemy字段類型
| 類型名 | python中類型 | 說明 |
|---|---|---|
| Integer | int | 普通整數(shù),一般是32位 |
| SmallInteger | int | 取值范圍小的整數(shù),一般是16位 |
| BigInteger | int或long | 不限制精度的整數(shù) |
| Float | float | 浮點數(shù) |
| Numeric | decimal.Decimal | 普通數(shù)值,一般是32位 |
| String | str | 變長字符串 |
| Text | str | 變長字符串,對較長或不限長度的字符串做了優(yōu)化 |
| Unicode | unicode | 變長Unicode字符串 |
| UnicodeText | unicode | 變長Unicode字符串,對較長或不限長度的字符串做了優(yōu)化 |
| Boolean | bool | 布爾值 |
| Date | datetime.date | 日期 |
| Time | datetime.datetime | 日期和時間 |
| LargeBinary | str | 二進(jìn)制文件 |
常用的SQLAlchemy列選項
| 選項名 | 說明 |
|---|---|
| primary_key | 如果為True,代表表的主鍵 |
| unique | 如果為True,代表這列不允許出現(xiàn)重復(fù)的值 |
| index | 如果為True,為這列創(chuàng)建索引,提高查詢效率 |
| nullable | 如果為True,允許有空值,如果為False,不允許有空值 |
| default | 為這列定義默認(rèn)值 |
常用的SQLAlchemy關(guān)系選項
| 選項名 | 說明 |
|---|---|
| backref | 在關(guān)系的另一模型中添加反向引用,用于設(shè)置外鍵名稱,在1查多的 |
| primary join | 明確指定兩個模型之間使用的連表條件 |
| uselist | 如果為False,不使用列表,而使用標(biāo)量值 |
| order_by | 指定關(guān)系中記錄的排序方式 |
| secondary | 指定多對多關(guān)系中關(guān)系表的名字 |
| secondary join | 在SQLAlchemy中無法自行決定時,指定多對多關(guān)系中的二級連表條件 |