Python连接操作数据库(python连接数据库代码)
off999 2024-10-12 06:14 76 浏览 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
相关推荐
- 安全教育登录入口平台(安全教育登录入口平台官网)
-
122交通安全教育怎么登录:122交通网的注册方法是首先登录网址http://www.122.cn/,接着打开网页后,点击右上角的“个人登录”;其次进入邮箱注册,然后进入到注册页面,输入相关信息即可完...
- 大鱼吃小鱼经典版(大鱼吃小鱼经典版(经典版)官方版)
-
大鱼吃小鱼小鱼吃虾是于谦跟郭麒麟的《我的棒儿呢?》郭德纲说于思洋郭麒麟作诗的相声,最后郭麒麟做了一首,师傅躺在师母身上大鱼吃小鱼小鱼吃虾虾吃水水落石出师傅压师娘师娘压床床压地地动山摇。...
-
- 哪个软件可以免费pdf转ppt(免费的pdf转ppt软件哪个好)
-
要想将ppt免费转换为pdf的话,我们建议大家可以下一个那个wps,如果你是会员的话,可以注册为会员,这样的话,在wps里面的话,就可以免费将ppt呢转换为pdfpdf之后呢,我们就可以直接使用,不需要去直接不需要去另外保存,为什么格式转...
-
2026-02-04 09:03 off999
- 电信宽带测速官网入口(电信宽带测速官网入口app)
-
这个网站看看http://www.swok.cn/pcindex.jsp1.登录中国电信网上营业厅,宽带光纤,贴心服务,宽带测速2.下载第三方软件,如360等。进行在线测速进行宽带测速时,尽...
- 植物大战僵尸95版手机下载(植物大战僵尸95 版下载)
-
1可以在应用商店或者游戏平台上下载植物大战僵尸95版手机游戏。2下载教程:打开应用商店或者游戏平台,搜索“植物大战僵尸95版”,找到游戏后点击下载按钮,等待下载完成即可安装并开始游戏。3注意:确...
- 免费下载ppt成品的网站(ppt成品免费下载的网站有哪些)
-
1、Chuangkit(chuangkit.com)直达地址:chuangkit.com2、Woodo幻灯片(woodo.cn)直达链接:woodo.cn3、OfficePlus(officeplu...
- 2025世界杯赛程表(2025世界杯在哪个国家)
-
2022年卡塔尔世界杯赛程公布,全部比赛在卡塔尔境内8座球场举行,2022年,决赛阶段球队全部确定。揭幕战于当地时间11月20日19时进行,由东道主卡塔尔对阵厄瓜多尔,决赛于当地时间12月18日...
- 下载搜狐视频电视剧(搜狐电视剧下载安装)
-
搜狐视频APP下载好的视频想要导出到手机相册里方法如下1、打开手机搜狐视频软件,进入搜狐视频后我们点击右上角的“查找”,找到自已喜欢的视频。2、在“浏览器页面搜索”窗口中,输入要下载的视频的名称,然后...
- 永久免费听歌网站(丫丫音乐网)
-
可以到《我爱音乐网》《好听音乐网》《一听音乐网》《YYMP3音乐网》还可以到《九天音乐网》永久免费听歌软件有酷狗音乐和天猫精灵,以前要跳舞经常要下载舞曲,我从QQ上找不到舞曲下载就从酷狗音乐上找,大多...
- 音乐格式转换mp3软件(音乐格式转换器免费版)
-
有两种方法:方法一在手机上操作:1、进入手机中的文件管理。2、在其中选择“音乐”,将显示出手机中的全部音乐。3、点击“全选”,选中所有音乐文件。4、点击屏幕右下方的省略号图标,在弹出菜单中选择“...
- 电子书txt下载(免费的最全的小说阅读器)
-
1.Z-library里面收录了近千万本电子书籍,需求量大。2.苦瓜书盘没有广告,不需要账号注册,使用起来非常简单,直接搜索预览下载即可。3.鸠摩搜书整体风格简洁清晰,书籍资源丰富。4.亚马逊图书书籍...
- 最好免费观看高清电影(播放免费的最好看的电影)
-
在目前的网上选择中,IMDb(互联网电影数据库)被认为是最全的电影网站之一。这个网站提供了各种类型的电影和电视节目的海量信息,包括剧情介绍、演员表、评价、评论等。其还提供了有关电影制作背后的详细信息,...
- 孤单枪手2简体中文版(孤单枪手2简体中文版官方下载)
-
要将《孤胆枪手2》游戏的征兵秘籍切换为中文,您可以按照以下步骤进行操作:首先,打开游戏设置选项,通常可以在游戏主菜单或游戏内部找到。然后,寻找语言选项或界面选项,点击进入。在语言选项中,选择中文作为游...
欢迎 你 发表评论:
- 一周热门
-
-
抖音上好看的小姐姐,Python给你都下载了
-
全网最简单易懂!495页Python漫画教程,高清PDF版免费下载
-
飞牛NAS部署TVGate Docker项目,实现内网一键转发、代理、jx
-
win7系统还原步骤图解(win7还原电脑系统的步骤)
-
Python 3.14 的 UUIDv6/v7/v8 上新,别再用 uuid4 () 啦!
-
python入门到脱坑 输入与输出—str()函数
-
16949认证费用是多少(16949审核员太难考了)
-
linux软件(linux软件图标)
-
Python三目运算基础与进阶_python三目运算符判断三个变量
-
(新版)Python 分布式爬虫与 JS 逆向进阶实战吾爱分享
-
- 最近发表
- 标签列表
-
- 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)
