在 Django 中操作數據庫有兩種方式。第一種方式就是使用原生sql語句操作,第二種就是使用 ORM模型來操作。這里介紹第一種。
Python 操作 MySQL 數據庫
Python 標准數據庫接口為Python DB-API
,Python DB-API
為開發人員提供了數據庫應用編程接口。
DB-API
是一個規范. 它定義了一系列必須的對象和數據庫存取方式, 以便為各種各樣的底層數據庫系統和多種多樣的數據庫接口程序提供一致的訪問接口 。Python的DB-API
,為大多數的數據庫實現了接口,使用它連接各數據庫后,就可以用相同的方式操作各數據庫。
不同的數據庫需要下載不同的DB API模塊,例如你需要訪問Oracle數據庫和Mysql數據,你需要下載Oracle和MySQL數據庫模塊。
Python DB-API
使用流程:
- 引入 API 模塊。
- 獲取與數據庫的連接。
- 執行SQL語句和存儲過程。
- 關閉數據庫連接。
什么是MySQLdb?
MySQLdb
是用於Python鏈接Mysql數據庫的接口,它實現了 Python 數據庫 API 規范 V2.0,基於 MySQL C API
上建立的。安裝MySQLdb? 參考: https://blog.csdn.net/jiduochou963/article/details/86767470
Python 3.7.1 (v3.7.1:260ec2c36a, Oct 20 2018, 14:57:15) [MSC v.1915 64 bit (AMD64)] on win32
Type "help", "copyright", "credits" or "license()" for more information.
>>>
>>> import MySQLdb
# 打開數據庫連接
>>> db = MySQLdb.connect("127.0.0.1", "root", "123456", "django_test", charset='utf8')
# 使用cursor()方法獲取操作游標
>>> cursor = db.cursor()
# 使用execute方法執行SQL語句
>>> cursor.execute("SELECT * FROM django_migrations")
15
# 使用 fetchone() 方法獲取一條數據
>>> data = cursor.fetchone()
>>> print("data: ", data)
data: (1, 'contenttypes', '0001_initial', datetime.datetime(2019, 2, 11, 1, 25, 32, 738504))
# 關閉數據庫連接
>>> db.close()
>>>
Django 操作 MySQL 數據庫
在 Django 中使用原生 sql 語句操作其實就是使用Python DB-API
的接口來操作。如果你的 mysql 驅動使用的是 mysqlclient,那么你就是使用mysqlclient 來操作的(這取決於你安裝的驅動),只不過 Django 將數據庫連接的這一部分封裝好了,我們只要在 settings.py
中配置好了數據庫連接信息后直接使用 Django 封裝好的接口就可以操作了。
示例代碼如下:
# 使用django封裝好的connection對象,會自動讀取settings.py中數據庫的配置信息
from django.db import connection
# 獲取游標對象
cursor = connection.cursor()
# 拿到游標對象后執行sql語句
cursor.execute("select * from book")
# 獲取所有的數據
rows = cursor.fetchall()
# 遍歷查詢到的數據
for row in rows:
print(row)
以上的 execute
以及 fetchall
方法都是 Python DB API
規范中定義好的。任何使用 Python 來操作 MySQL 的驅動程序都應該遵循這個規范。所以不管是使用 pymysql 或者是 mysqlclient 或者是 mysqldb ,他們的接口都是一樣的。更多規范請參考: https://www.python.org/dev/peps/pep-0249/ 。
Python DB API
規范下cursor對象常用接口:
1、description
: 如果 cursor 執行了查詢的 sql 代碼。那么讀取 cursor.description
屬性的時候,將返回一個列表,這個列表中裝的是元組,元組中裝的分別是 (name,type_code,display_size,internal_size,precision,scale,null_ok)
,其中 name
代表的是查找出來的數據的字段名稱,其他參數暫時用處不大。
2、rowcount
: 代表的是在執行了 sql 語句后受影響的行數。
3、close
: 關閉游標。關閉游標以后就再也不能使用了,否則會拋出異常。
4、execute(sql[,parameters])
: 執行某個 sql 語句。如果在執行 sql 語句的時候還需要傳遞參數,那么可以傳給 parameters 參數。示例代碼如下:
cursor.execute("select * from article where id=%s",(1,))
5、fetchone
: 在執行了查詢操作以后,獲取第一條數據。
6、fetchmany(size)
: 在執行查詢操作以后,獲取多條數據。具體是多少條要看傳的 size 參數。如果不傳 size 參數,那么默認是獲取第一條數據。
7、fetchall
: 獲取所有滿足 sql 語句的數據。
參考:
Python 操作 MySQL 數據庫 http://www.runoob.com/python/python-mysql.html