python操作MySQL数据库报错问题解决
编写好Python操作数据库的脚本后,运行报错如下:
报错1:“AttributeError: 'NoneType' object has no attribute 'encoding'”
解决办法:设置charset时要用utf8,不能用utf-8
if link_type == 0:
# 创建数据,返回字典
self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db,
charset='utf8', cursorclass=pymysql.cursors.DictCursor)
else:
# 创建数据库,返回元祖
self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db,
charset='utf8')
报错2:“AttributeError: 'OperationDbInterface' object has no attribute 'cur'”
错误原因:编写代码时,换行时没有对齐,导致调用cur时报错
贴上Python操作mysql数据库的源码:
# coding:utf8 '''
定义对mysql数据库操作的封装
1、包括基本的单条语句操作,如删除、修改、插入
2、独立地查询单条、多条数据
3、独立地添加多条数据
''' import logging, os, pymysql
from public import config class OperationDbInterface(object):
# 定义初始化数据库连接
def __init__(self, host_db='127.0.0.1', user_db='root', password_db='',
name_db='interface_test', port_db=3306, link_type=0):
'''
:param host_db: 数据库服务主机IP
:param user_db: 数据库连接用户名
:param password_db: 数据库密码
:param name_db: 数据库名称
:param port_db: 数据库端口号,整型数据
:param link_type: 连接类型,用于设置输出数据是元祖还是字典,默认是字典,link_type=0
:return:游标
'''
try:
if link_type == 0:
# 创建数据,返回字典
self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db,
charset='utf8', cursorclass=pymysql.cursors.DictCursor)
else:
# 创建数据库,返回元祖
self.conn = pymysql.connect(host=host_db, user=user_db, password=password_db, db=name_db, port=port_db,
charset='utf8')
self.cur = self.conn.cursor()
print("输出:%s" % self.cur)
except pymysql.Error as e:
print("创建数据库连接失败|Mysql Error %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=config.src_path + '/log/syserror.log', level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e) # 定义单条数据操作,包含删除和更新操作
def op_sql(self, condition):
'''
:param condition: sql语句,该通用方法可用来替代updateone,deleteone
:return: 字典形式
''' try:
self.cur.execute(condition) # 执行sql语句
self.conn.commit() # 提交游标数据
result = {'code': '', 'message': '执行通用操作成功', 'data': []}
except pymysql.Error as e:
self.conn.rollback() # 执行回滚操作
result = {'code': '', 'message': '执行通用操作异常', 'data': []}
print("数据库错误|op_sql %d:%s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=config.src_path + '/log/syserror.log', level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
return result # 查询表中单条数据
def select_one(self, condition):
'''
:param condition: 查询单条sql语句
:return: 字典形式的单条查询语句
''' try:
rows_affect = self.cur.execute(condition)
if rows_affect > 0:
results = self.cur.fetchone() # 获取一条数据
result = {'code': '', 'message': '执行单条查询操作成功', 'data': results}
else:
result = {'code': '', 'message': '执行单条查询操作成功', 'data': []}
except pymysql.Error as e:
self.conn.rollback() # 执行回滚操作
result = {'code': '', 'message': '执行单条查询异常', 'data': []}
print("数据库错误|select_one %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=config.src_path + '/log/syserror.log', level=logging.DEBUG,
format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
return result # 查询表中多条数据
def select_all(self, condition):
'''
:param condition: sql语句
:return: 字典形式的批量查询结果
''' try:
rows_affect = self.cur.execute(condition)
if rows_affect > 0:
# 将鼠标光标放回到初始位置
self.cur.scroll(0, mode='absolute')
# 返回游标中所有结果
results = self.cur.fetchall()
result = {'code': '', 'message': '执行批量查询操作成功', 'data': results}
else:
result = {'code': '', 'message': '执行批量查询操作成功', 'data': []}
except pymysql.Error as e:
# 执行回滚操作
self.conn.rollback()
result = {'code': '', 'message': '执行批量查询异常', 'data': []}
logging.basicConfig(filename=config.src_path + '/log/syserror.log', level=logging.DEBUG,
format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
return result # 定义表中插入数据操作的方法
def insert_data(self, condition, params):
'''
:param condition: 插入语句
:param params: 插入数据,列表形式[(,,,),(,,,)]
:return: 字典形式批量插入数据结果
'''
try:
results = self.cur.executemany(condition, params) # 返回插入数据的条数
self.conn.commit()
result = {'code': '', 'message': '执行批量插入数据成功', 'data': results}
except pymysql.Error as e:
self.conn.rollback() # 执行回滚操作
result = {'code': '', 'message': '执行批量插入数据异常', 'data': []}
print("数据库错误|insert_data %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=config.src_path + '/log/syserror.log', level=logging.DEBUG,
format='%(asctime)s %(filename)s [line:%(lineno)d] %(levelname)s %(massage)s')
logger = logging.getLogger(__name__)
logger.exception(e)
return result # 关闭数据库
def __del__(self):
if self.cur is not None:
self.cur.close() # 关闭游标
if self.conn is not None:
self.conn.close() # 释放数据库资源 if __name__ == "__main__":
test = OperationDbInterface() # 实例化类
result_select_all = test.select_all("select * from config_test") # 查询所有数据
result_select_one = test.select_one("select * from config_test where id=1") # 查询单条数据
result_oP_sql = test.op_sql("UPDATE config_test SET value_config='修改后的valuetest' WHERE id=1") # 通用操作,修改数据库
result__insert_sql = test.insert_data(
"insert into config_test (key_config, value_config, description, status) values (%s, %s, %s, %s)",
[('mytest1', 'mytestvalue1', '我插入的测试数据1', 1), ('mytest2', 'mytestvalue2', '我插入的测试数据2', 0)])
print(result_select_all['data'], result_select_all['message'])
print(result_select_one['data'], result_select_one['message'])
print(result_oP_sql['data'], result_oP_sql['message'])
print(result__insert_sql['data'], result__insert_sql['message'])
python操作MySQL数据库报错问题解决的更多相关文章
- python操作三大主流数据库(1)python操作mysql①windows环境中安装python操作mysql数据库的MySQLdb模块mysql-client
windows安装python操作mysql数据库的MySQLdb模块mysql-client 正常情况下应该是cmd下直接运行 pip install mysql-client 命令即可,试了很多台 ...
- python操作mysql数据库的常用方法使用详解
python操作mysql数据库 1.环境准备: Linux 安装mysql: apt-get install mysql-server 安装python-mysql模块:apt-get instal ...
- python操作mysql数据库的相关操作实例
python操作mysql数据库的相关操作实例 # -*- coding: utf-8 -*- #python operate mysql database import MySQLdb #数据库名称 ...
- Windows下安装MySQLdb, Python操作MySQL数据库的增删改查
这里的前提是windows上已经安装了MySQL数据库,且配置完成,能正常建表能操作. 在此基础上仅仅需安装MySQL-python-1.2.4b4.win32-py2.7.exe就ok了.仅仅有1M ...
- 使用python操作mysql数据库
这是我之前使用mysql时用到的一些库及开发的工具,这里记录下,也方便我查阅. python版本: 2.7.13 mysql版本: 5.5.36 几个python库 1.mysql-connector ...
- 连接mysql数据库报错java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized...解决方法
今天连接mysql数据库报错如下: java.sql.SQLException: The server time zone value '�й���ʱ��' is unrecognized or r ...
- python操作mysql数据库增删改查的dbutils实例
python操作mysql数据库增删改查的dbutils实例 # 数据库配置文件 # cat gconf.py #encoding=utf-8 import json # json里面的字典不能用单引 ...
- python 操作mysql数据库之模拟购物系统登录及购物
python 操作mysql数据库之模拟购物系统登录及购物,功能包含普通用户.管理员登录,查看商品.购买商品.添加商品,用户充值等. mysql 数据库shop 表结构创建如下: create TAB ...
- 【Python】使用python操作mysql数据库
这是我之前使用mysql时用到的一些库及开发的工具,这里记录下,也方便我查阅. python版本: 2.7.13 mysql版本: 5.5.36 几个python库 1.mysql-connector ...
随机推荐
- Scapy编写ICMP扫描脚本
使用Scapy模块编写ICMP扫描脚本: from scapy.all import * import optparse import threading import os def scan(ipt ...
- Linux 基础篇
本文使用系统为 :CentOS 7 1.文件操作 增: touch a.txt #增加文件 mkdir test # 增加目录 参数:-p 创建多级目录 ; 删: rm a.txt # ...
- JSP(二)----指令,注释,内置对象
## JSP 1.指令 * 作用:用于配置JSP页面,导入资源文件 * 格式: <%@ 指令名称 属性名1=属性值1 属性名2=属性值2 %> <%@ page con ...
- 带有路径压缩和rank优化的并查集实现
public class unionfind2 implements UF { int[] parent; int[] rank; public unionfind2(int n) { parent= ...
- pycharm工程包导入问题
当我们将外部的python项目导入pycharm工程中时,会出现同一个包的python文件无法在另一个文件引用的问题: 解决方法如下: 在此设置中,将需要导入的文件或包变为蓝色 步骤:1.点击需要导入 ...
- Python学习前端之JavaScript
JavaScript介绍 1992年Nombas开发出C-minus-minus(C--)的嵌入式脚本语言(最初绑定在CEnvi软件中),后将其改名ScriptEase(客户端执行的语言). Nets ...
- 4.Metasploit框架更新
Metasploit 进阶第二讲 框架更新 EDB平台-互联网安全漏洞库 Exploit_DB是一个面向全世界安全工作人员的漏洞提交平台,是一份公开已知漏洞的存档,便于企业改善公司的安全情况 ...
- 惊呆了!不改一行 Java 代码竟然就能轻松解决敏感信息加解密|原创
前言 出于安全考虑,现需要将数据库的中敏感信息加密存储到数据库中,但是正常业务交互还是需要使用明文数据,所以查询返回我们还需要经过相应的解密才能返回给调用方. ps:日常开发中,我们要有一定的安全意识 ...
- # CodeCraft-20 (Div. 2)
CodeCraft-20 (Div. 2) A. Grade Allocation 思路 : 无脑水题 代码 #include<iostream> #include<algorith ...
- 【Java技术系列】爱情36技之暗送秋波的技术
1. 这篇文章想分享已经很久了,苦于皱巴巴的技术比较生涩难懂,迟迟没有找到好的分享方式,今天结合爱情中暗送秋波的故事的形式,尝试分享一下. 以后如果再有人问你们:能否在加载类的时候,对字节码进行修改? ...