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

 

posted on 2020-04-09 16:02  江湖乄夜雨  阅读(2779)  评论(0编辑  收藏  举报