2022/6/18总结——Python之pymysql
1、Python连接数据库
要想操作数据库,仅连接数据是不够的,必须拿到操作数据库的游标才能进行后续操作,比如读取数据、添加数据。通过获取到的数据库连接示例conn下的cursor()方法来创建游标。游标用来返回结果。
import pymysql conn = pymysql.connect('locahost',user='root',passwd='123456',db='testdb',charset='utf-8') cusor = conn.cursor
备注:cursor返回一个游标实例对象,其中包含很多操作数据的方法,比如执行SQL语句。
执行SQL语句execute和executemany:
execute(query,args=None):执行单条SQL语句,执行成功后返回受影响的行数。query为要执行的sql语句,且为字符串类型。args为可选的序列或映射,用于query的参数值,如果args为序列,query中必须使用%s做占位符;如果args为映射,query中必须使用%(key)s做占位符。
executemany(query,args=None):批量执行SQL语句,比如批量插入数据,执行成功后返回受影响的行数,query为要执行的sql语句,且为字符串类型。args为嵌套的序列或映射,用于query的参数值。
示例:
创建数据库:
import pymysql #打开数据库连接,不需要指定数据库,因为需要创建数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #获取游标 cusor = conn.cursor #创建数据库 cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT CHARSET utf8 COLLATE utf8_general_ci;') #先关闭游标 cursor.close() #再关闭数据库 con.close() print('数据库创建成功')
备注:创建后可使用show databases查询确认
创建表:
import pymysql #打开数据库连接,指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',db='testdb',charset='utf-8') #获取游标 cusor = conn.cursor #创建user表 cursor.execute('drop table if exists user') sql="""CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0""" cursor.execute(sql) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('user表创建成功')
插入单条数据:
import pymysql #打开数据库连接,不指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #选择需要连接的数据库 conn.select_db('testdb') #获取游标 cusor = conn.cursor insert = cur.execute("insert into user values(1,'tom',18)") print("添加语句受影响的行数:",insert) #第二种插入数据的方式,通过字符串传入值 sql = "insert into user values(%s,%s,%s)" cur.execute(sql,(3,'kongsh',20)) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('SQL执行成功')
批量插入多条数据:
import pymysql #打开数据库连接,不指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #选择需要连接的数据库 conn.select_db('testdb') cusor = conn.cursor #获取游标 sql = "insert into user values(%s,%s,%s)" cur.executemany(sql,[(4,'wen',20),(5,'tom',10),(6,'test',30)]) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('SQL执行成功') 备注:批量插入多条SQL语句采用的是executemany(sql,args)函数,返回受影响的行数。 args参数是一个包含多个元组的列表,每个元组对应一条mysql中的一条数据。这里的%s不需要加引号,否则插入数据的数据类型错误
查询数据:
使用execute()函数得到的只是受影响的行数,并不能真正拿到查询的内容。cursor对象还提供了3中提取数据的方法:fetchone、fetchmany、fetchall。每个方法都会导致游标移动。
cursor.fetchone():获取游标所在处的一行数据,返回元组,没有返回None;
cursor.fetchmany(size):接受size行返回结果行。如果size大于返回的结果行的数量,则会返回cursor.aruuaysize条数据。
cursor.fetchall():接收全部的返回结果行。
示例:
fetchone:
import pymysql #打开数据库连接,不指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #选择需要连接的数据库 conn.select_db('testdb') cusor = conn.cursor #获取游标 cur.execute("select * from user") while 1: res = cur.fetchone() if res is None: break print(res) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('SQL执行成功') #输出结果: (1,'tom',18) (3,'kongsh',20) (4,'wen',20) (5,'tom',10) (6,'test',30)
备注:fetchone()函数必须跟execute()函数结合使用,并且在execute()函数之后使用。
fetchmany:
import pymysql #打开数据库连接,不指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #选择需要连接的数据库 conn.select_db('testdb') cusor = conn.cursor #获取游标 cur.execute("select * from user") resTuple = cur.fetchmany(3) for res in resTuple: print(res) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('SQL执行成功') #输出结果: (1,'tom',18) (3,'kongsh',20) (4,'wen',20) 备注:从exceute()函数结果中获取游标所在处的size条数据,并以元组的形式返回, 元组的每一个元素都也是一个由一行数据组成的元组,如果size大于有效的结果行数, 将会返回cursor.arraysize条数据,但如果游标所在处没有数据,将返回空元组。 查询几条数据,游标将会向下移动几个位置。fetmany()函数必须跟exceute()函数结合使用, 并且在exceute()函数之后使用
fetchall:
import pymysql #打开数据库连接,不指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #选择需要连接的数据库 conn.select_db('testdb') cusor = conn.cursor #获取游标 cur.execute("select * from user") resTuple = cur.fetchall() print("共%d条数据"%len(resTuple)) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('SQL执行成功')
更新数据:
更新单条数据:
import pymysql #打开数据库连接,不指定数据库 conn = pymysql.connect('locahost',user='root',passwd='123456',charset='utf-8') #选择需要连接的数据库 conn.select_db('testdb') cusor = conn.cursor #获取游标 #更新一条数据 update = cur.execute("update user set age=100 where name='kongsh'") print ('修改后受影响的行数为:',update) #查询一条数据 cur.execute('select * from user where name="kongsh";') print(cur.fetchone()) #先关闭游标 cursor.close() #再关闭数据库 con.close() print('SQL执行成功')
更新多条数据:
import pymysql conn = pymysql.connect("localhost",'root','123456',charset='utf-8') conn.select_db("testdb") cursor = conn.cursor() #更新前查询所有数据 cur.execute("select * from user where name in ('kongsh','wen');") for res in cur.fetchall(): print(res) #更新两条数据 sql = update user set age=%s where name=%s update = cur.executemany(sql,[(15,'kongsh'),(18,'wen')]) cur.execute() #更新2条数据后查询所有数据 cur.execute("select * from user where name in ('kongsh','wen');") print('更新后的数据为:') for res in cur.fetchall(): print (res) cur.close() conn.commit() conn.close() print('sql执行成功')
删除数据:
删除单条数据:
import pymysql conn = pymysql.connect("localhost",'root','123456',charset='utf-8') conn.select_db("testdb") cursor = conn.cursor() #更新前查询所有数据 cur.execute("select * from user;") print("删除前的数据为:") for res in cur.fetchall(): print(res) #删除一条数据 sql = 'delete from user where id=1' cur.execute() #查询删除后的所有数据 cur.execute("select * from user") print('更新后的数据为:') for res in cur.fetchall(): print (res) cur.close() conn.commit() conn.close() print('sql执行成功')
删除多条数据:
import pymysql conn = pymysql.connect("localhost",'root','123456',charset='utf-8') conn.select_db("testdb") cursor = conn.cursor() #更新前查询所有数据 cur.execute("select * from user;") print("删除前的数据为:") for res in cur.fetchall(): print(res) #删除两条数据 sql = 'delete from user where id=%s' cur.executemany(sql,[(3),(4)]) #查询删除后的所有数据 cur.execute("select * from user") print('更新后的数据为:') for res in cur.fetchall(): print (res) cur.close() conn.commit() conn.close() print('sql执行成功')
事务回滚:
import pymysql #打开数据库连接 conn=pymysql.connect('localhost','root','123456') conn.select_db('pythondb') #获取游标 cur=conn.cursor() #修改前查询所有数据 cur.execute("select * from user;") print('修改前的数据为:') for res in cur.fetchall(): print (res) print ('*'*40) #更新表中第1条数据 cur.execute("update user set name='xiaoxiaoxiaoxiaoren' where id=5") #修改后查询所有数据 cur.execute("select * from user;") print('修改后的数据为:') for res in cur.fetchall(): print (res) print ('*'*40) #回滚事务 conn.rollback() cur.execute("select * from user;") print('回滚事务后的数据为:') for res in cur.fetchall(): print (res) cur.close() conn.commit() conn.close() print('sql执行成功')
插入100条数据到数据库:
'''插入100条数据到数据库(每次插入一条)''' import pymysql import string,random #打开数据库连接 conn=pymysql.connect('localhost','root','123456') conn.select_db('testdb') #获取游标 cur=conn.cursor() #创建user表 cur.execute('drop table if exists user') sql="""CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0""" cur.execute(sql) #修改前查询所有数据 cur.execute("select * from user;") print('修改前的数据为:') for res in cur.fetchall(): print (res) print ('*'*40) #循环插入数据 words=list(string.ascii_letters) sql="insert into user values(%s,%s,%s)" for i in range(100): random.shuffle(words)#打乱顺序 cur.execute(sql,(i+1,"".join(words[:5]),random.randint(0,80))) #插入100条后查询所有数据 cur.execute("select * from user;") print('修改后的数据为:') for res in cur.fetchall(): print (res) print ('*'*40) cur.close() conn.commit() conn.close() print('sql执行成功')
一次插入多条:
'''插入100条数据到数据库(一次插入多条)''' import pymysql import string,random #打开数据库连接 conn=pymysql.connect('localhost','root','123456') conn.select_db('testdb') #获取游标 cur=conn.cursor() #创建user表 cur.execute('drop table if exists user') sql="""CREATE TABLE IF NOT EXISTS `user` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(255) NOT NULL, `age` int(11) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=0""" cur.execute(sql) #修改前查询所有数据 cur.execute("select * from user;") print('修改前的数据为:') for res in cur.fetchall(): print (res) print ('*'*40) #循环插入数据 words=list(string.ascii_letters) sql="insert into user values(%s,%s,%s)" random.shuffle(words)#打乱顺序 cur.executemany(sql,[(i+1,"".join(words[:5]),random.randint(0,80)) for i in range(100) ]) #插入100条后查询所有数据 cur.execute("select * from user;") print('修改后的数据为:') for res in cur.fetchall(): print (res) print ('*'*40) cur.close() conn.commit() conn.close() print('sql执行成功')
Python调用mysql存储过程:
# encoding: utf-8 # sql导出 # mysqldump -u root -p db_name > test_db.sql import MySQLdb class MySqlOp(object): def __init__(self, login_msg): self.host = login_msg[0] self.port = login_msg[1] self.db_name = login_msg[2] self.user = login_msg[3] self.passwd = login_msg[4] self.charset = 'utf8' # 更新 def operate(self, sql): db = MySQLdb.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_name, charset=self.charset) cur = db.cursor() try: # 执行sql语句 cur.execute(sql) cur.close() # 提交到数据库执行 db.commit() except Exception as e: print(e) cur.close() # Rollback in case there is any error db.rollback() # 关闭数据库连接 db.close() # 插入 def select(self, sql): db = MySQLdb.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_name, charset=self.charset) cur = db.cursor() results = None try: # 执行sql语句 cur.execute(sql) # 获取所有记录列表 results = cur.fetchall() # print(results) except Exception as e: print(e) # 关闭数据库连接 db.close() return results # 调用存储过程 def callproc(self, sql, args=[]): db = MySQLdb.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db_name, charset=self.charset) cur = db.cursor() results = None try: # 执行sql语句 cur.callproc(sql, args) # 获取所有记录列表 results = cur.fetchall() cur.close() # 提交到数据库执行 db.commit() # print(results) except Exception as e: print(e) # 关闭数据库连接 cur.close() # Rollback in case there is any error db.rollback() db.close() return results @classmethod def int_c(cls, int_): ''' 整数处理 ''' return int_ if int_ else 'null' @classmethod def str_c(cls, str_): ''' 字符串处理 ''' return "'{}'".format(str_) if str_ else 'null'
调用:
if __name__ == '__main__': # 连接信息 [ip, 端口, 数据库名, 用户名, 密码] login_msg = ['192.168.0.1', 3306, 'student_db', 'paisen', 'abcd1234'] msq = MySqlOp(login_msg) # 查询 book = msq.select('''show full columns from data;''') print(book) # 更新 msq.operate('''insert into student (no, name) values (1, "刘华强");''') # 调用存储过程 cover = msq.callproc('getDataCoverPath', [100,]) print(cover)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!