pymysql模块
导入pymysql模块
import pymysql
连接数据库
conn = pymysql.connect(
host = '127.0.0.1',
port = 3306,
user = 'root'
password = 'mysql123',
database = 'exercise',
charset = 'utf-8'
)
获取光标对象
获取元组类型的光标(默认)
获取字典类型的光标
# 光标为元组的形式
cursor = conn.cursor()
# 把光标改变为字典的形式
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
执行SQL语句
sql = 'sql语句'
# 执行语句
cursor.execute(sql,[sql语句的拼接参数])
关闭
cursor.close()
conn.close()
基本操作
sql = 'insert into userinfo(username,password) values (%s,%s)'
cursor.execute(sql,['kk','kkk']) # 执行SQL语句,并传入参数
conn.commit() #上传更改的数据
插入数据失败回滚
conn.rollback()
执行回滚操作。获取插入数据的ID值
在关联表查询时有可能会使用到,可以获得插入数据的ID值
实例
sql = 'insert into userinfo(username,password) values (%s,%s)'
cursor.execute(sql,['abc','abc']) # 执行SQL语句
conn.commit() # 上传更改的数据
last_id = cursor.lastrowid
# 输入插入的ID值
print(last_id)
#输出:6
```
# 数据库数据,插入的abc对应主键id为6
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | abner | 123 |
| 2 | marry | 456 |
| 3 | sunny | 789 |
| 4 | dam | 000 |
| 5 | kk | kkk |
| 6 | abc | abc |
+----+----------+----------+
```
批量插入数据
实例:
sql = 'insert into userinfo(username,password) values (%s,%s)'
data = [('rain','123'),('cc','aaa'),('vivi','vvv')] # 要插入的多条数据
cursor.executemany(sql,data) # 批量执行SQL语句
conn.commit() #上传更改的数据
# 数据库插入结果:
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | abner | 123 |
| 2 | marry | 456 |
| 3 | sunny | 789 |
| 4 | dam | 000 |
| 5 | kk | kkk |
| 6 | abc | abc |
| 7 | rain | 123 |
| 8 | cc | aaa |
| 9 | vivi | vvv |
+----+----------+----------+
注意:执行一条语句使用execute(),批量执行使用executemany(sql,data),数据必须以列表套元组的形式传入
pymysql模块中的删和数据库内的删除一样,唯一的区别在于必须上传数据的更新。
# 删除username为'kk'的行
sql = "delete from userinfo where username='kk'"
cursor.execute(sql)
conn.commit() #上传更改的数据
# 数据库处理的结果:
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | abner | 123 |
| 2 | marry | 456 |
| 3 | sunny | 789 |
| 4 | dam | 000 |
| 6 | abc | abc |
| 7 | rain | 123 |
| 8 | cc | aaa |
| 9 | vivi | vvv |
+----+----------+----------+
和MySQL环境里类似,同理在pymysql中需要更新上传数据。
sql = 'update userinfo set password=%s where username=%s;'
cursor.execute(sql,['111','abner'])
conn.commit() #上传更改的数据
# 数据库的结果:
+----+----------+----------+
| id | username | password |
+----+----------+----------+
| 1 | abner | 111 |
| 2 | marry | 456 |
| 3 | sunny | 789 |
| 4 | dam | 000 |
| 6 | abc | abc |
| 7 | rain | 123 |
| 8 | cc | aaa |
| 9 | vivi | vvv |
+----+----------+----------+
查询单条数据
sql = 'select * from userinfo;'
cursor.execute(sql)
conn.commit() #上传更改的数据
ret = cursor.fetchone() # 查询一条数据
print(ret)
# 输出:{'id': 1, 'username': 'abner', 'password': '111'}
cursor.fetchone()
查询多条数据
sql = 'select * from userinfo;'
cursor.execute(sql)
conn.commit() #上传更改的数据
ret = cursor.fetchall() # 查询全部数据
print(ret)
# 输出:[{'id': 1, 'username': 'abner', 'password': '111'}, {'id': 2, 'username': 'marry', 'password': '456'}, {'id': 3, 'username': 'sunny', 'password': '789'}, {'id': 4, 'username': 'dam', 'password': '000'}, {'id': 6, 'username': 'abc', 'password': 'abc'}, {'id': 7, 'username': 'rain', 'password': '123'}, {'id': 8, 'username': 'cc', 'password': 'aaa'}, {'id': 9, 'username': 'vivi', 'password': 'vvv'}]
sql = 'select * from userinfo;'
cursor.execute(sql)
conn.commit() #上传更改的数据
ret = cursor.fetchmany(3) # 查询三条数据
print(ret)
# 输出:[{'id': 1, 'username': 'abner', 'password': '111'}, {'id': 2, 'username': 'marry', 'password': '456'}, {'id': 3, 'username': 'sunny', 'password': '789'}]
高阶用法
光标的绝对移动
sql = 'select * from userinfo;'
cursor.execute(sql)
conn.commit() #上传更改的数据
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
cursor.scroll(0,mode='absolute') # 将光标移动到开头
ret = cursor.fetchone() # 查询一条数据
print(ret)
# 输出:
[{'id': 1, 'username': 'abner', 'password': '111'}, {'id': 2, 'username': 'marry', 'password': '456'}]
[{'id': 3, 'username': 'sunny', 'password': '789'}, {'id': 4, 'username': 'dam', 'password': '000'}]
[{'id': 6, 'username': 'abc', 'password': 'abc'}, {'id': 7, 'username': 'rain', 'password': '123'}]
[{'id': 8, 'username': 'cc', 'password': 'aaa'}, {'id': 9, 'username': 'vivi', 'password': 'vvv'}]
{'id': 1, 'username': 'abner', 'password': '111'}
光标的相对移动
sql = 'select * from userinfo;'
cursor.execute(sql)
conn.commit() #上传更改的数据
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
ret = cursor.fetchmany(2) # 查询两条数据
print(ret)
cursor.scroll(-1,mode='relative') # 将光标移动到现在位置的上一个位置
ret = cursor.fetchone() # 查询一条数据
print(ret)
# 输出:
[{'id': 1, 'username': 'abner', 'password': '111'}, {'id': 2, 'username': 'marry', 'password': '456'}]
[{'id': 3, 'username': 'sunny', 'password': '789'}, {'id': 4, 'username': 'dam', 'password': '000'}]
[{'id': 6, 'username': 'abc', 'password': 'abc'}, {'id': 7, 'username': 'rain', 'password': '123'}]
[{'id': 8, 'username': 'cc', 'password': 'aaa'}, {'id': 9, 'username': 'vivi', 'password': 'vvv'}]
{'id': 9, 'username': 'vivi', 'password': 'vvv'}
%s
,在execute执行时,第二个参数以列表的形式传参拼接SQL语句。#执行SQL语句
sql = "select * from userinfo where username=%s and password=%s"
#使用光标对象执行SQL语句
ret = cursor.execute(sql,[username,password])