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

posted on 2021-09-16 18:22  chen_2987  阅读(82)  评论(0)    收藏  举报

导航