python连接mysql基本操作

打开数据库连接

与数据库进行连接需要在pymysql.connect()函数中传入参数数据库地址(本机就写localhost),还有用户名user,密码password,数据库名db;
返回的是数据的游标,游标可以对数据进行读取,添加,删除等操作

import pymysql
# pymysql.connect('本机就写localhost',user = '',passwd=,db = '')
conn = pymysql.connect('localhost',user = "root",passwd = "10xxxang",db = "pythonDB")
print (conn) # <pymysql.connections.Connection object at 0x000001C9E1241D30>

数据的游标实例化

cursor返回一个游标实例对象,其中包含了很多操作数据的方法,比如执行sql语句

cursor = conn.cursor()
print(cursor) # <pymysql.cursors.Cursor object at 0x000001C9E1820BA8>

执行sql语句execute

execute(query,args=None)执行单条的sql语句,执行成功后返回受影响的行数
query:要执行的sql语句,字符串类型
args:可选的序列或映射,用于query的参数值。如果args为序列,query中必须使用%s做占位符;如果args为映射,query中必须使用%(key)s做占位符

cursor.execute('CREATE DATABASE IF NOT EXISTS pythonDB DEFAULT CHARSET utf8 ;') # 这个最好大写
# 创建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)
# 向表中插入数据
insert = cursor.execute("insert into user values(1,'tom',18)")
print('添加语句受影响的行数:',insert) # # 添加语句受影响的行数: 1

# 另一种插入数据的方式,通过字符串传入值
sql = "insert into user values(%s,%s,%s)"
cursor.execute(sql,(3,'kongsh',20))

执行sql语句executemany

插入多条数据 executemany(query,args=None)执行成功后返回受影响的行数
query:要执行的sql语句,字符串类型
args:嵌套的序列或映射,用于query的参数值;是一个包含多个元组的列表,
每个元组对应一条mysql中的一条数据。这里的%s不需要加引号,否则插入数据的数据会类型错误

# coon.select_db('数据库的名字') # 这样可以自主的选择数据库
sql  =  "insert into user values(%s,%s,%s)"
insert = cursor.executemany(sql,[(4,'wen',20),(5,'tom',10),(6,'test',30)])
print('批量插入返回手影响的行数:',insert) #批量插入返回手影响的行数: 3

查询数据

execute()函数的得到的只是受影响的行数
cursor对象提供了3种提取数据的方法:fetchone,fetchmany,fetchall
每种方法都会导致游标移动,注意游标的位置
cursor.fetchone():获取游标所在处的一行数据,返回元组,没有返回None
cursor.fetchmany(size):接受size行返回结果行。如果size大于返回的结果行的数量,则会返回cursor.arraysize条数据。
cursor. fetchall():接收全部的返回结果行。

# cursor.execute("select * from user;")
# while 1:
#     res = cursor.fetchone() #etchone()函数必须跟exceute()函数结合使用,并且在exceute()函数之后使用
#     # 这个是执行一次返回一个游标所在位置的数据
#     # 执行过程
#     '''
#     以元组的形式返回游标所在处的一条数据,
#     如果游标所在处没有数据,将返回空元组,
#     该数据执行一次,游标向下移动一个位置
#     '''
#     if res is None:
#         # 表示已经取完结果集
#         break
#     print(res)
# print('*'*10,'第二种查询数据的方法','*'*10)
# # fetchmany
# # 取3条数据
# res_Tuple = cursor.fetchmany(3)
# print(type(res_Tuple))

# print(res_Tuple) # ((1, 'tom', 18), (3, 'kongsh', 20), (4, 'wen', 20))

# print('*'*10,'第三种查询数据的方法','*'*10)
# # fetchall执行完这个方法后,游标将移动到数据库表的最后
# res_all = cursor.fetchall()
# print('共有%d条数据:'%len(res_all)) # 共有2条数据:下标移动到了第三位,总共5个数据

更新数据

#更新一条数据

upadte = cursor.execute("update user set age=100 where name='kongsh'")
# 更新多条数据
sal = "update user set age=%s where name=%s"
update_1 = cursor.executemany(sal,[(15,'kongsh'),(18,'wen')])

删除数据

# 删除单条数据
cursor.execute("delete from user where id=1")

# 删除多条数据
sql = "delete from user where id=%s"
cursor.executemany(sql,[(3),(4)])

事务回滚

# 事务回滚,回滚到原来的状态
conn.rollback() # 要用数据库链接进行事务回滚

事务提交

cursor.close() # 先关闭游标
conn.commit() #提交数据
conn.close() # 再关闭数据库连接

### 写入多个sql语句注意点
1.数据库性能瓶颈很大一部份就在于网络IO和磁盘IO,将多个sql语句放在一起,只执行一次IO,可以有效的提升数据库性能。推荐此方法
2.用executemany()方法一次性批量执行sql语句,固然很好,但是当数据一次传入过多到server端,可能造成server端的buffer溢出,也可能产生一些意想不到的麻烦。所以,合理、分批次使用executemany是个合理的办法
posted @ 2021-07-03 15:03  索匣  阅读(174)  评论(0编辑  收藏  举报