問(wèn)題:
django的ORM語(yǔ)句和原生sql語(yǔ)句大相徑庭叔收,在項(xiàng)目開(kāi)發(fā)中如何確保寫(xiě)的ORM語(yǔ)句與自己想要的sql語(yǔ)句師一直的呢???
解決方案:
方案1:
當(dāng)是查詢(xún)語(yǔ)句且查詢(xún)結(jié)果是QuerySet對(duì)象時(shí)纱注,可以使用QuerySet的query屬性查看轉(zhuǎn)化成的sql語(yǔ)句,如下:
newses = NewsModel.objects.select_related('category','author').all()[0:2]
print(newses.query)
print('---'*25)
print(NewsModel.objects.all().query)
print('---'*25)
print(NewsModel.objects.filter(id__gt=2)[3:5].query)
# 打印結(jié)果:
SELECT `news_newsmodel`.`id`, `news_newsmodel`.`title`, `news_newsmodel`.`desc`, `news_newsmodel`.`thumbnail`, `news_newsmodel`.`publish_time`, `news_newsmodel`.`content`, `news_newsmodel`.`category_id`, `news_newsmodel`.`author_id`, `cms_newscategorymodels`.`id`, `cms_newscategorymodels`.`name`, `authPro_user`.`id`, `authPro_user`.`password`, `authPro_user`.`last_login`, `authPro_user`.`is_superuser`, `authPro_user`.`telephone`, `authPro_user`.`username`, `authPro_user`.`email`, `authPro_user`.`is_active`, `authPro_user`.`gender`, `authPro_user`.`date_joined`, `authPro_user`.`is_staff` FROM `news_newsmodel` LEFT OUTER JOIN `cms_newscategorymodels` ON (`news_newsmodel`.`category_id` = `cms_newscategorymodels`.`id`) LEFT OUTER JOIN `authPro_user` ON (`news_newsmodel`.`author_id` = `authPro_user`.`id`) ORDER BY `news_newsmodel`.`publish_time` DESC LIMIT 2
---------------------------------------------------------------------------
SELECT `news_newsmodel`.`id`, `news_newsmodel`.`title`, `news_newsmodel`.`desc`, `news_newsmodel`.`thumbnail`, `news_newsmodel`.`publish_time`, `news_newsmodel`.`content`, `news_newsmodel`.`category_id`, `news_newsmodel`.`author_id` FROM `news_newsmodel` ORDER BY `news_newsmodel`.`publish_time` DESC
---------------------------------------------------------------------------
SELECT `news_newsmodel`.`id`, `news_newsmodel`.`title`, `news_newsmodel`.`desc`, `news_newsmodel`.`thumbnail`, `news_newsmodel`.`publish_time`, `news_newsmodel`.`content`, `news_newsmodel`.`category_id`, `news_newsmodel`.`author_id` FROM `news_newsmodel` WHERE `news_newsmodel`.`id` > 2 ORDER BY `news_newsmodel`.`publish_time` DESC LIMIT 2 OFFSET 3
方案2:
直接在項(xiàng)目中使用原生sql語(yǔ)句對(duì)數(shù)據(jù)庫(kù)進(jìn)行操作胆胰,python借助pymysql模塊操作mysql的簡(jiǎn)單流程如下:
# 導(dǎo)入pymysql模塊
import pymysql
#定義配置信息(字典形式)
db_config = {
'host' : '127.0.0.1',
'user' : 'xxx', #數(shù)據(jù)庫(kù)連接用戶(hù)
'password' : 'xxx', #數(shù)據(jù)庫(kù)連接密碼
'db' : 'tan' #數(shù)據(jù)庫(kù)名
}
# 建立連接
conn = pymysql.connect(**db_config)
# 建立游標(biāo)
cursor = conn.cursor()
# 執(zhí)行sql語(yǔ)句: cursor.excute("原生sql語(yǔ)句") 注意:此處的原生sql語(yǔ)句結(jié)尾不用加狞贱;
cursor.excute("select * from students")
#獲取數(shù)據(jù)(列表形式),此處需主動(dòng)獲取數(shù)據(jù)
values = cursor.fetchall()
# 打印數(shù)據(jù)
for value in values:
print(value)
#提交操作
conn.commit()
#游標(biāo)關(guān)閉
cursor.close()
#連接關(guān)閉
conn.close()
方案3:
django框架采用的ORM模型煮剧,我們可以通過(guò)mysql的日志記錄實(shí)時(shí)查看執(zhí)行的sql語(yǔ)句斥滤,具體步驟如下:
第一步:進(jìn)入mysql将鸵,查看日志開(kāi)啟的狀態(tài)和log文件路徑勉盅;
mysql> show variables like "%general_log%";
+------------------+-------------------------+
| Variable_name | Value |
+-------------------+------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/VIP.log |
+------------------+-------------------------+
2 rows in set (0.00 sec)
第二步:如上操作,OFF說(shuō)明沒(méi)有開(kāi)啟日志記錄顶掉,我們可以通過(guò)如下命令設(shè)置日志啟動(dòng)狀態(tài) or 更改日志路徑和日志名草娜;
mysql> set global general_log_file = '/var/lib/mysql/localhost.log';
mysql> set global general_log = 'ON';
mysql> show variables like "%general_log%";
+------------------+------------------------------+
| Variable_name | Value |
+------------------+------------------------------+
| general_log | ON |
| general_log_file | /var/lib/mysql/localhost.log |
+------------------+------------------------------+
2 rows in set (0.00 sec)
!Q魍病宰闰!注意:
日志開(kāi)啟后,所有執(zhí)行的sql都會(huì)被記錄下來(lái)簿透,但是如果重啟mysql就會(huì)停止記錄移袍,即general_log的值變回OFF!
/****** 更改general_log='ON'后若重啟mysql服務(wù) *****/
# 重啟mysql服務(wù)
service mysql restart
# 進(jìn)入mysql再次查看日志狀態(tài)老充,general_log再次變?yōu)镺FF
mysql> show variables like "%general_log%";
+------------------+------------------------+
| Variable_name | Value |
+------------------+------------------------+
| general_log | OFF |
| general_log_file | /var/lib/mysql/VIP.log |
+------------------+------------------------+
2 rows in set (0.00 sec)
拓展:
mysql數(shù)據(jù)庫(kù)支持兩種日志存儲(chǔ)方式:文件(file) and 數(shù)據(jù)表(table)
# 查詢(xún)mysql日志存儲(chǔ)方式
mysql> show variables like "%log_output%";
# 設(shè)置mysql日志存儲(chǔ)方式:文件存儲(chǔ)方式(默認(rèn)方式)
set global log_output = "FILE";
# 設(shè)置mysql日志存儲(chǔ)方式:數(shù)據(jù)表存儲(chǔ)方式
set global log_output = "TABLE";
# 設(shè)置mysql日志存儲(chǔ)方式:文件和數(shù)據(jù)表同時(shí)存儲(chǔ)日志
set global log_output = "TABLE,FILE";
以上方法也只是讓你看思路的一種 具體的還是要自己做一些優(yōu)化葡盗,反正這個(gè)是在百度上看到的 感覺(jué)比較好玩 可以看看