2022/6/18
作者:互联网
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执行成功')
"
标签:execute,cur,18,cursor,user,2022,print,conn 来源: https://www.cnblogs.com/Lily-Li/p/16389743.html