python连接数据库操作
1.直接上案例:
#!/usr/bin/env python3 #coding: utf-8 import pymysql from flask import request, jsonify def get_conn(): return pymysql.connect(host='192.168.20.187', user='chenwei', password='432705', db='dalan_test', charset='utf8') # 数据查询 def _select(sql, data=()): conn = get_conn() # 获取操作游标 with conn.cursor() as cursor: cursor.execute(sql, data) # 执行sql #res = cursor.fetchone() # 获取查询结果(只显示一行) res = cursor.fetchall() # 获取查询结果,显示所有行 conn.commit() # 提交到数据库执行 conn.close() # 关闭数据库连接 return res #删除数据 def _delete(sql, data=()): conn = get_conn() with conn.cursor() as cursor: # 执行sql res = cursor.execute(sql, data) conn.commit() conn.close() return res #更新数据 def _update(sql, data=()): conn = get_conn() with conn.cursor() as cursor: # 执行sql res = cursor.execute(sql, data) conn.commit() conn.close() return res # 数据写入 def _insert(sql, data=()): conn = get_conn() with conn.cursor() as cursor: # 执行sql res = cursor.execute(sql, data) conn.commit() conn.close() return res if __name__ == '__main__': ##查询数据-写法一 # sql = "select * from platform_list where test_account=%s" # res = _select(sql, ('18520103625',)) # 执行sql # print(res) ##查询数据-写法二 # bb='origin_name=96 and novice="是"'#非数字需要引号 # sql='select * FROM platform_list WHERE {}'.format(bb) # res = _select(sql) # 执行sql # print(res) ##通过字典确定查询条件 sql = "select * from platform_list where "#定义基础sql condition={'test_account': '18520103625', 'device': '3HX7N17428002494'}#查询条件 ##变量字典查询 for k, v in condition.items(): sql += "{k}=%s and ".format(k=k) #或者这样写 sql += "{}=%s and ".format(k) sql2=sql.rstrip(" and")#去掉尾部指定字符 res=_select(sql2,('18520103625','3HX7N17428002494')) print(res) # #删除数据 # sql="delete from platform_list where id=%s and origin_name=%s" # _delete(sql, ('8','10')) # 执行sql # # ##插入数据 # sql = "insert into platform_list(apk_link,original_id,pkg_id,service_name,service_time,service_status,creation_time,novice) values(%s, %s,%s,%s, %s,%s,%s,%s)" # _insert(sql, (_apk_link, _original_id,_pkg_id,_service_name,_service_time,_service_status,date_time,_novice))#插入数据库 # # ##更新数据 # sql="update platform_list set original_id=%s,pkg_id=%s,service_name=%s,service_time=%s where apk_link=%s" # _update(sql, (_original_id,_pkg_id,_service_name,_service_time,_apk_link)) # 执行sql
解决:
Warning: (1292, "Truncated incorrect DOUBLE value: '3HX7N17428002494'")
result = self._query(query)
2.直接拼接sql:
#!/usr/bin/env python3 #coding: utf-8 import pymysql from flask import request, jsonify def get_conn(): return pymysql.connect(host='192.168.20.187', user='chenwei', password='432705', db='dalan_test', charset='utf8') def _select(sql, data=()): '''数据查询''' conn = get_conn() # 获取操作游标 for k, v in data.items(): v=repr(v)#把值加引号,不然只能操作int类型 sql += "{k}={v} and ".format(k=k,v=v) #或者这样写 sql += "{}=%s and ".format(k) select_sql=sql.rstrip(" and")#去掉尾部指定字符 print('执行sql:',select_sql) cursor=conn.cursor()#使用cursor()方法获取数据库的操作游标 cursor.execute(select_sql)#执行sql res = cursor.fetchall()#获取所有行 conn.commit() # 提交到数据库执行 conn.close() # 关闭数据库连接 return res def _install(sql): '''插入一条数据''' conn = get_conn() # 获取操作游标 cursor=conn.cursor()#使用cursor()方法获取数据库的操作游标 print('执行sql语句为:{}'.format(sql)) cursor.execute(sql)#执行sql conn.commit() # 提交到数据库执行 conn.close() # 关闭数据库连接 return True if __name__ == '__main__': ##通过字典确定查询条件 # sql = "select * from platform_list where "#定义基础sql # condition={'test_account': '18520103625', 'device': '3HX7N17428002494'}#查询条件 # res=_select(sql,condition)#基础sql,字典参数 # print(res) ###通过字典组装插入语句 sql = "insert into node_list({}) VALUES ({})"#定义基础sql a='';b='' #condition是字段和记录 condition={'associated_original': '96', 'project': '推荐服', 'node_name': '打开游戏', 'creare_time': '2021-09-27T14:55', 'associated_element': '1,3,5,6', 'enable': '是'} for k, v in condition.items(): v=repr(v)#把值加引号,不然只能操作int类型 a+=('{},'.format(k))#key表示字段 b+=('{},'.format(v))#value表示记录值 aa=a.rstrip(",");bb=b.rstrip(",") sql=sql.format(aa,bb) print('执行结果:',_install(sql))
3.解决查询datetime类型的数据:
比如查询结果为:(1, '渠道包', 1, datetime.datetime(2022, 3, 15, 18, 10, 14)
需要改成日期类型:
import json import datetime class DateEncoder(json.JSONEncoder): def default(self,obj): #判断类型 if isinstance(obj,datetime.datetime): return obj.strftime('%Y-%m-%d %H:%M:%S') elif isinstance(obj,date): return obj.strftime("%Y-%m-%d") else: return json.JSONEncoder.default(self,obj) date='sql的执行结果' result_json =json.dumps(date,cls=DateEncoder)#对结果处理
备注:获取日期可以通过下标直接获取比如:a=(1, '渠道包', 1, datetime.datetime(2022, 3, 15, 18, 10, 14) 可以通过a[3] 获取日期
4.查询指定条件:
#!/usr/bin/env python3 #coding: utf-8 import pymysql def get_conn(): return pymysql.connect(host='192.168.20.187', user='chenwei', password='432705', db='dalan_test', charset='utf8') def _select(sql, data=()): '''数据查询''' conn = get_conn() # 获取操作游标 if data:#判断是否有查询条件 sql=sql+' where ' for k, v in data.items(): v=repr(v)#把值加引号,不然只能操作int类型 sql += "{k}={v} and ".format(k=k,v=v) #或者这样写 sql += "{}=%s and ".format(k) select_sql=sql.rstrip(" and")#去掉尾部指定字符 print('执行sql:',select_sql) cursor=conn.cursor()#使用cursor()方法获取数据库的操作游标 cursor.execute(select_sql)#执行sql res = cursor.fetchall()#获取所有行 conn.commit() # 提交到数据库执行 conn.close() # 关闭数据库连接 return res if __name__ == '__main__': #通过字典确定查询条件 sql = "select * from platform_list"#定义基础sql condition={'test_account': '18520103625'}#查询条件 #res=_select(sql)#不带查询条件 res=_select(sql,condition)#带查询条件 print(res)
5.mysql查询返回dict
#!/usr/bin/env python3 #coding: utf-8 import json import pymysql from pymysql import cursors def get_conn(): '''如果需要mysql返回结果为dict,需要加上cursorclass=cursors.DictCursor即可''' return pymysql.connect(host='192.168.20.187', user='chenwei', password='432705', db='dalan_test', charset='utf8',cursorclass=cursors.DictCursor) # 数据查询 def _select(sql, data=()): conn = get_conn() # 获取操作游标 with conn.cursor() as cursor: cursor.execute(sql, data) # 执行sql res = cursor.fetchone() # 获取查询结果(只显示一行) #res = cursor.fetchall() # 获取查询结果,显示所有行 conn.commit() # 提交到数据库执行 conn.close() # 关闭数据库连接 return res if __name__ == '__main__': #调用方式一: sql = "select * from element_list where id>%s" res = _select(sql, ('51',)) # 执行sql print(res) #调用方式二: sql = "select * from element_list where id>{}".format('51') print(_select(sql, ()))#执行sql并打印结果 ''' 如果使用fetchall返回多条时,需要遍历list 字典的key是表的字段,value是对应的记录 '''
相关连接:
https://blog.csdn.net/forever_insist/article/details/105714033 ............................................python封装mysql操作
https://blog.csdn.net/inthat/article/details/116269985 .........................................................Python报错:datetime.datetime(2021, 1, 6, 18, 0, 36) is not JSON serializable
浙公网安备 33010602011771号