Python连接操作数据库(python连接数据库代码)
off999 2024-10-12 06:14 61 浏览 0 评论
mysql
python3中用pymysql操作mysql数据库
pip3 install PyMySQL
图片描述
图片描述
import pymysql
conn = pymysql.Connect(host='127.0.0.1',port=3306,user='root',passwd='zk1991zk',db='mytest',charset='utf8')
cursor = conn.cursor()
sql = "select * from user"
cursor.execute(sql)
rs = cursor.fetchall()
print('rs:', rs)
for each in rs:
print(each)
图片描述
更新数据库insert/update/delete
不同于select操作,这三个操作修改了数据库内容,所以需要commit(),否则数据库没有做相应的更改,但是也不会报错。
import pymysql
conn = pymysql.Connect(host='127.0.0.1', port=3306, user='root', passwd='zk1991zk',db="mytest")
conn.autocommit(False)
cursor = conn.cursor()
sqlInsert = "insert into user(id, name) value('6','Alex')"
sqlUpdate = "update user set name = 'Jason',email='sha5xiang@gmail.com' where id = '2'"
sqlDelete = "delete from user where id='6' "
try:
cursor.execute(sqlInsert)
print(cursor.rowcount)
cursor.execute(sqlUpdate)
print(cursor.rowcount)
cursor.execute(sqlDelete)
print(cursor.rowcount)
conn.commit()
except Exception as e:
print("Reason:", e)
conn.rollback()
cursor.close()
cursor.close()
图片描述
图片描述
图片描述
mysql-connector
安装:
pip install mysql-connector
1、作用
mysql 模块的再包装,并支持 with语法。
将使用简化抽象为:
- 连接数据库;
- 执行sql语句并获得返回结果;
- 关闭数据库(使用with的时候可以省略);
2、示例
示例1(with语法)
# 连接数据库
with MySQLTool(user=user, password=pw, database=database) as m2:
# 执行sql并获得返回结果
result2 = m2.run_sql([
['insert person(name, age) values ("李四", 20), ("王五", 30)'],
['select * from person']
])
# 打印结果
print(result2)
示例2(普通语法)
m = MySQLTool()
# 查看mysql容器内 ip,参考这个链接:https://blog.csdn.net/CSDN_duomaomao/article/details/75638544
m.connect(user=user,
password=pw,
# host=ip,
database=database)
result = m.run_sql([
['insert person(name,age) values (%s, %s)', ['六六六', 666]],
['select * from person']
])
print(result)
m.close()
示例
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import sys
from mysql import connector
from ..printcolor_lingling import print_testresult
import time
_user = ''
_password = ''
_database = ''
_host = '127.0.0.1'
_port = 3306
_unix_socket = None
def errlog(msg):
with open('./log/mysql-err.log', 'a')as f:
f.write('%s||%s:%s\n' % (
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
sys._getframe(1).f_code.co_name, # 执行errlog这个函数的函数名字,即上一级函数
msg
))
def sqllog(sql, args=[]):
with open('./log/mysql.log', 'a')as f:
f.write('%s||%s:%s\n' % (
time.strftime("%Y-%m-%d %H:%M:%S", time.localtime()),
sys._getframe(1).f_code.co_name, # 执行errlog这个函数的函数名字,即上一级函数
sql % tuple(args)
))
class MySQLTool(object):
def __init__(self, **args):
self.c = None
self.cursor = None
# 参数不足2个则直接扔掉,因为至少需要 root 和 password
if not ('user' in args and 'password' in args):
pass
else:
# 超过3个,取传的参数的值
self.args = args
# 连接到数据库,参数要么传值,要么使用默认值
# 这里的默认值是从 mysql/connector/abstracts.py 复制来的
def connect(self,
user=_user,
password=_password,
database=_database,
host=_host,
port=_port,
unix_socket=_unix_socket):
self.c = connector.connect(user=user,
password=password,
database=database,
host=host,
port=port,
unix_socket=unix_socket)
self.cursor = self.c.cursor()
# with 的时候执行,返回值是 with...as e 中的e的值
def __enter__(self):
self.connect(**self.args)
return self
# with 内部代码块执行完毕后执行
def __exit__(self, exc_type, exc_value, traceback):
if exc_type:
print('Error')
else:
self.close()
# 执行 SQL 语句,并返回最后一次查询的查询结果
# 如果错误,返回False,其他时候返回结果
# 适用于select时使用。建议insert和update使用专有函数
def run_sql(self, sql_list):
error = False
try:
# 依次执行 sql 语句
for sql in sql_list:
print('sql: %s', sql)
if len(sql) == 1:
self.cursor.execute(sql[0])
sqllog(sql[0])
else:
self.cursor.execute(*sql)
sqllog(sql[0], sql[1])
# 这里如果报错,说明操作是比如 create table 之类的操作,返回 None
result = self.cursor.fetchall()
except BaseException as e:
print(e)
error = True
errlog(str(e))
finally:
# 如果错误,返回False,其他时候返回结果
if error:
return False
else:
return result
# 更新专用函数。
# 错误返回False,未更新(比如说不需要更新)返回0,成功更新返回更新的行数,例如影响了2行数据就是2
def update_row(self, sql, args):
error = False
change_rows = None
try:
self.cursor.execute(sql, args)
sqllog(sql, args)
# 判断一下影响了多少条数据,如果为0条,说明啥事都没干
change_rows = self.get_cu_rowcount()
except BaseException as e:
print(e)
error = True
errlog(str(e))
finally:
# 如果错误,返回False,其他时候返回结果
if error:
return False
else:
return change_rows
# 插入一行。
# 插入失败(报错或无法插入)返回False,插入成功返回插入行的id
def insert_row(self, sql, args):
error = False
try:
# 正常情况下,返回值为None
self.cursor.execute(sql, args)
sqllog(sql, args)
# 判断一下影响了多少条数据,如果为0条,说明啥事都没干
change_rows = self.get_cu_rowcount()
if change_rows == 0:
error = True
except BaseException as e:
error = True
msg = str(e)
errlog(msg)
finally:
if error:
return False
else:
return self.get_last_insert_id()
# 同时插入多行(也可以只插入一行)
# 如果插入错误/或未成功插入,会返回False
# 插入成功,则返回插入的条数
# 示例:m.insert_more_rows(
# 'insert person(name,age) values (%s, %s)',
# [('六六六', 666)]
# )
def insert_more_rows(self, sql, args):
error = False
change_rows = None
try:
# 正常情况下,返回值为None
self.cursor.executemany(sql, args)
sqllog(sql, args)
# 判断一下影响了多少条数据,如果为0条,说明啥事都没干
change_rows = self.get_cu_rowcount()
if change_rows == 0:
error = True
except BaseException as e:
error = True
msg = str(e)
errlog(msg)
finally:
if error:
return False
else:
return change_rows
# 返回 cursor
def get_cursor(self):
return self.cursor
# 当上一次操作是插入或更新时,获取插入/更新影响的行数。比如插入一条就是一行
# 如果是 -1,表示上一次操作不是插入
def get_cu_rowcount(self):
return self.cursor.rowcount
# 获取上一个插入行的id(需要要插入后执行才能正确返回id,否则返回None)
def get_last_insert_id(self):
return self.cursor.lastrowid
# 手动提交事务,部分场景下可能有用
def commit(self):
self.c.commit()
# 关闭连接
def close(self):
self.cursor.close()
self.c.commit()
self.c.close()
# 测试代码和示例代码
# 以下代码的执行前提是本机有一个 mysql 的容器,这个容器参照这个链接
# https://github.com/qq20004604/docker-learning/tree/master/docker-demo-02-MySQL
if __name__ == '__main__':
is_error = False
try:
# 测试数据
user = 'docker'
pw = '1654879wddgfg'
database = 'docker_test_database'
# ---- 测试代码2 ----
# 连接数据库
with MySQLTool(user=user, password=pw, database=database) as m2:
# 执行sql并获得返回结果
result2 = m2.run_sql([
['insert person(name, age) values ("李四", 20), ("王五", 30)'],
['select * from person']
])
# 打印结果
print(result2)
print("——————————————————————")
# ---- 测试代码1 ----
m = MySQLTool()
# 查看mysql容器内 ip,参考这个链接:https://blog.csdn.net/CSDN_duomaomao/article/details/75638544
m.connect(user=user,
password=pw,
# host=ip,
database=database)
result = m.insert_more_rows(
'insert person(name,age) values (%s, %s)',
[('六六六', 666)]
)
if result is False:
is_error = True
result2 = m.insert_row(
'insert person(name,age) values (%s, %s)',
('六六六', 666)
)
if result is False:
is_error = True
m.close()
except BaseException as e:
print(e)
is_error = True
print_testresult(not is_error, 'MySQLTool')
下一章我们讲 银行转账实例的实现
注意点
- NoneType' object has no attribute 'encoding' ,之前指明的charset必须是"UTF8",不是"utf-8"/"UTF-8"
- MySQL语句后面必须有';',否则不会报错,也难以发现
- 数据库insert/update/delete操作需要commit()
- 在构造命令的时候,注意用 " 包裹起来,因为SQL语句字符串需要 ' 包裹。所以," 比较简单的避免歧义。
参考
python3操作MySQL数据库Python3读取Excel数据存入MySQL
相关推荐
- 腾达路由器手机端登录入口(腾达路由器手机端登录入口在哪)
-
腾达路由器使用192.168.0.1或tendawifi.com作为登录地址。登录管理员页面的步骤:1、手机连接到腾达路由器的wifi信号;2、在手机上打开浏览器,在地址栏输入192.168.0.1后...
-
- 百度网盘app下载安装手机版(百度网盘app安卓版)
-
百度网盘没有关闭离线下载功能,可以通过以下方法进行离线下载:1、打开手机,找到手机中的百度网盘:2、打开百度网盘,找到右下角的“我的”,找到屏幕中的“离线下载”:3、点击打开离线下载,选择“新建链接任务”,然后点击“确定”:4、在新建链接页...
-
2025-12-21 03:51 off999
- 安卓虚拟机破解版(挽念虚拟机15.0破解版)
-
正盗版都是广联达公司内部出来的,破解の用来打市场,正版的用来获取利润,个人破不了1、确保你的虚拟机网路设置正确。2、如果采用的是独立无线网卡那么要确保独立网卡能被虚拟机识别,虚拟机安装了独立无线网卡...
- win7系统改中文(win7系统换中文)
-
要将Windows7系统从英文切换为中文,可以按照以下步骤进行:1.打开控制面板:点击Windows开始菜单,选择“控制面板”。2.打开区域和语言设置:在控制面板中,找到“时钟、语言和区域”或“...
- win10启动盘怎么制作(windows10如何制作启动盘)
-
要制作Win10PE启动盘,首先需要下载Win10PE镜像文件。然后,使用专业的制作工具(如Rufus或WinToUSB)将镜像文件写入U盘或DVD。接下来,将U盘或DVD插入需要启动的计算机,并在B...
- 磁盘分区win7(磁盘分区win r)
-
1操作分区比较简单,但需要严格按照步骤进行,否则可能会导致数据丢失或无法启动等问题。2首先要进入磁盘管理界面,找到新安装的硬盘,右键选择“新建简单卷”,按照步骤设置分区大小、驱动器号、文件系统等。...
- cad2007破解版安装序列号(cad破解版的序列号)
-
1安装过程中可能会出现一些常见错误。例如,安装程序无法启动、安装程序突然中止或无法完成、安装后无法启动CAD等。2这些错误的原因可能是由于系统环境不符合要求,或者是由于安装程序本身出现问题。3为...
- windows7旗舰版安装密钥(win7安装密钥和激活密钥)
-
一、在线获取激活密钥1、访问官方网站:打开浏览器,访问微软官方网站。2、注册账号:如果没有微软账号,需要先注册一个账号。3、登录账号:使用注册的账号登录微软官方网站。4、获取密钥:在官方网站上找到wi...
- vmware下载哪个版本(vmware各版本下载)
-
vmos能运行原神。VMOS(虚拟大师)是一款以VirtualMachine(简称VM,即虚拟机)技术为主的APP(安卓应用软件)。通过VM技术,把开源的安卓系统(支持任意版本),无需root,以普...
- 在哪下载win7系统比较可靠(去哪下载win7)
-
靠谱,系统之家的系统装好后不需要激活,也不要钱。只是系统之家的所有东西,系统也好,软件也好。都有强有力的写在系统底层的顽固病毒,只要碰过系统之家就永远杀不干净。当然了,永远关不掉的广告弹窗也是基本操作...
- 一般家庭宽带用多少兆为最佳
-
这个要根据实际情况来确定,一般情况下,家庭宽带有50兆、100兆及200兆。如果是三口之家,平时也就看看电视,或刷刷手机,50兆的就够了。如果人口多,面积为四室二厅的房子,同时有人看电视有人玩游戏,有...
- 电脑配置太高装不了win7(电脑配置太高装不了win7怎么办)
-
如果是这样,那就不要安装Win7了,安装Win10即可。原因如下:1、win10系统是一个大势所趋。新的事物,你必须要接触、要熟悉,虽然目前还可以暂时回避,但是几年后呢,win7必然会像xp一样退出历...
- 移动硬盘读取不出来(移动硬盘读取不出来了,怎么拿数据)
-
1、移动硬盘插入电脑,选择计算机,选择左侧“此电脑”,点击右击。2、选择“管理”点击,进入计算机管理;选择磁盘“磁盘管理”。3、如没有看到移动硬盘,可以选择右边的更多操作,重新扫描磁盘。4、如依然没有...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
python入门到脱坑 输入与输出—str()函数
-
宝塔面板如何添加免费waf防火墙?(宝塔面板开启https)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
失业程序员复习python笔记——条件与循环
-
系统u盘安装(win11系统u盘安装)
-
- 最近发表
- 标签列表
-
- python计时 (73)
- python安装路径 (56)
- python类型转换 (93)
- python进度条 (67)
- python吧 (67)
- python的for循环 (65)
- python格式化字符串 (61)
- python静态方法 (57)
- python列表切片 (59)
- python面向对象编程 (60)
- python 代码加密 (65)
- python串口编程 (77)
- python封装 (57)
- python写入txt (66)
- python读取文件夹下所有文件 (59)
- python操作mysql数据库 (66)
- python获取列表的长度 (64)
- python接口 (63)
- python调用函数 (57)
- python多态 (60)
- python匿名函数 (59)
- python打印九九乘法表 (65)
- python赋值 (62)
- python异常 (69)
- python元祖 (57)
