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