Python操作MySQL
-
操作流程
image
1.先创建数据库连接,与数据库完成连接,使用语句如下:
conn = pymysql.connect()
2.创建游标,游标是用来开拓出一片区域,暂时保存我们所操作的数据,使用语句如下:
cur = conn.cursor()
3.在创建的游标下执行SQL,这样就不会影响到数据库的其他内容,使用语句如下:
cur.execute(sql)
4.提交游标数据到数据库,使用语句如下:
conn.commit()
5.关闭游标,使用语句如下:
cur.close()
6.关闭数据库连接,使用语句如下:
conn.close()
-
遇到的问题与解决方法
- 第一个问题:pymysql模块的导入
python2.x版本导入的是MySQLdb这个模块,而python3.x导入的是pymysql,百度了下,成功导入了pymysql模块 - 第二个问题:数据库的连接
一开始并不知道怎么使用MySQL的本地连接和Navicat,多方查找和学习后,学会了搭建本地数据库环境,这个解决之后,之前运行一堆报错的代码问题也基本迎刃而解了。 - 第三个问题:插入多条数据
cur.execute()只能执行单条数据,在下面的operate_more方法下仍使用这个就行不通了,因为是多条数据,所以要使用批量执行语句cur.executemany()
- 第一个问题:pymysql模块的导入
- 完整源码
根据课件完善的代码如下:
# -*- coding:utf-8 -*-
'''
定义对mysql数据库基本操作的封装
1.包括基本的单条语句操作,删除、修改、更新
2.独立查询单条、查询多条数据
3.独立添加多条数据
'''
import pymysql
import logging
import os
class OperationDbInterface(object):
def __init__(self):
self.conn = pymysql.connect(host='localhost',
user='root',
password='root',
db='test',
port=3306,
charset='utf8',
cursorclass=pymysql.cursors.DictCursor) # 创建数据库连接
self.cur = self.conn.cursor() # 创建游标
# 定义单条数据操作,增删改
def op_sql(self, params):
try:
self.cur.execute(params) # 执行sql语句
self.conn.commit()
return True
except pymysql.Error as e:
print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levekname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
return False
# 查询表中单条数据
def select_one(self, condition):
try:
self.cur.execute(condition)
results = self.cur.fetchone() # 获取一条结果
except pymysql.Error as e:
results = 'sql0001' # 数据库执行失败
print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
finally:
return results
# 查询表中所有数据
def select_all(self, condition):
try:
self.cur.execute(condition)
self.cur.scroll(0, mode='absolute') # 光标回到初始位置
results = self.cur.fetchall() # 返回游标中所有结果
except pymysql.Error as e:
results = 'sql0001' # 数据库执行失败
print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
finally:
return results
# 定义更多数据操作(插入数据,更新数据,删除数据)
def operate_more(self, condition, params):
try:
self.cur.executemany(condition, params)
self.conn.commit()
return True
except pymysql.Error as e:
results = 'sql0001' # 数据库执行失败
print("MySQL Error %d: %s" % (e.args[0], e.args[1]))
logging.basicConfig(filename=os.path.join(os.getcwd(), './log.txt'),
level=logging.DEBUG,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levekname)s %(message)s')
logger = logging.getLogger(__name__)
logger.exception(e)
return results
# 数据库关闭
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_1 = test.select_one('select*from persons') # 查询一条数据
print(result_1)
result_2 = test.select_all('select*from persons') # 查询所有数据
print(result_2)
result_3 = test.operate_more('insert into persons values (%s, %s, %s)', (4, '付千', '兰州')) # 插入一条数据
print(result_3)
# tmp = ((4, '付千', '兰州'), (5, '韩以', '温州'), (6, '曹七', '丽水'))
# result_4 = test.operate_more("insert into persons values (%s, %s, %s)", tmp) # 插入三条数据
# print(result_4)
result_5 = test.operate_more('delete from persons where NAME = %s', ('李阳')) # 删除一条数据
print(result_5)
result_6 = test.operate_more('update persons set NAME = %s where NAME = %s', ('陈浩', '陈昊')) # 修改一条数据
print(result_6)
网友评论