pymysql往數據庫中插入datetime類型的"空數據"與MySQL5.7sql_mode的一個問題


MySQL5.6測試

MySQL的版本

 查看一下sel_mode

創建數據庫及表

創建一個test數據庫,里面有一張userinfo表:

birthday這個字段可以為空 —— MySQL中datetime類型的數據默認的空值為NULL,不是空字符串!

往里面寫入一些數據:

使用原生SQL修改里面的數據

use test;

update userinfo set birthday="2012-01-03" where name="whw";

select name,age,birthday from userinfo where name="whw";

結果如下:

使用pymysql往數據庫中插入datetime類型的數據(注意空數據的寫法)

import pymysql

#連接數據庫 —— 注意這里password得寫成字符串類型!!! 
conn = pymysql.connect(host='localhost',port=3306,user='root',password='123',database='test',charset='utf8')
#獲取光標對象
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor) #返回的是一個含有多個字典的列表
#添加數據
try:
    sql1 = "insert into userinfo(name,age,birthday) values(%s,%s,%s)"
     # 支持字符串類型的日期數插入數據庫的datetime類型的字段
    cursor.execute(sql1,["wanghw",3,"2017-09-09"])

    # 如果插入datetime類型的數據為空的話,格式是(None)
    sql2 = "insert into userinfo(name,age,birthday) values(%s,%s,%s)" cursor.execute(sql2,["whh",5,(None)]) except Exception as e:
    # 回滾
    conn.rollback()
cursor.close()
conn.close()
print(f"事物執行失敗{e}") else: conn.commit()
cursor.close()
conn.close()
print(f"事物執行成功!}")

結果如下:

MySQL5.6的group by查詢

我們使用group by查詢一下里面的數據 —— 注意select后面的name字段既沒放在聚合函數中也不是group by的字段!

MySQL5.7的sql_mode=only_full_group_by的一個問題

由於本地測試機的MySQL的版本是5.6的,5.7版本在別的地方測試一下。

這回我們來看一下MySQL5.7版本的sql_mode:

可以看到:MySQL5.7版本默認情況下設置了多項sql_mode,我們今天來看一下ONLY_FULL_GROUP_BY這個的影響。

然后我們在MySQL5.7中測試一下既不在聚合函數中也不是分組字段的group by的查詢:

可以看到,在MySQL5.7下這樣的查詢報錯了,原因就是MySQL5.7默認設置了:sql_mode=only_full_group_by。

意思是:

對於GROUP BY聚合操作,如果在SELECT中的列,沒有在GROUP BY中出現,那么這個SQL是不合法的,因為列不在GROUP BY從句中,也就是說查出來的列必須在group by后面出現否則就會報錯,或者這個字段出現在聚合函數里面。

我們把上面的loginname加在聚合函數里面就好了:

解決的方法可以參考下面這幾篇博客:

https://blog.csdn.net/yalishadaa/article/details/72861737

https://blog.csdn.net/weixin_43064185/article/details/99646535

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM