使用python操作mysql,一般使用模块pymysql
终端执行下代码下载pymysql模块
pip install pymysql
对于pymysql模块的使用比较简单易学,主要存在几个关键函数,掌握就与此模块并无其他关联,主要是SQL语句的编写。
我的数据库存在这么一组数据
sid | student_id | course_id | number |
---|---|---|---|
4 | 2 | 3 | 87 |
8 | 3 | 3 | 48 |
12 | 1 | 2 | 48 |
13 | 1 | 3 | 59 |
14 | 2 | 1 | 98 |
15 | 3 | 1 | 68 |
下面看代码:
import pymysql
# 创建连接 固定格式,需要连接数据库的所有信息
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='9999',db='gao')
# 创建游标 何为游标?就是一个准备对数据库进行你想要的操作的对象
cursor = conn.cursor()
# 此处为重点,对于指定表中一个字段进行处理时,前面是处理的SQL语句,后面跟一个参数即可
r=cursor.execute('insert into score(number) values(%s,%s,%s)',69)
# 对于同一个表中多个字段进行处理时,前面SQL语句任相同,后面的传入参数使用元组以此填充
r=cursor.execute('insert into score(student_id,course_id,number) values(%s,%s,%s)',(1,2,69))
# 1次对于同一个表中多个字段进行多次处理时,前面SQL语句任相同,后面的传入参数使用元组包裹元组或列表包裹元组以此填充 等同于SQL语句中的values(),(),()
# 注意 多次处理使用的函数不同于单次 多次处理使用executemany,单次处理使用execute
l = [
(1,2,69),
(1,3,99),
(2,1,45),
]
r=cursor.executemany('insert into score(student_id,course_id,number) values(%s,%s,%s)',l)
# 返回的值是处理受影响的行数
print(r) # 此处是 1+1+3 5
# 确认提交,没有默认不执行游标进行的操作
conn.commit()
# 关闭游标
cursor.close()
# 关闭数据库连接
conn.close()
上述语句无法获取到查询的内容,故继续看代码:
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='9999',db='gao')
cursor = conn.cursor()
r=cursor.execute('select * from score')
print(r) # 返回查询内容中的影响到的行数 6
# 以此函数获取到所有返回的内容 返回是元组形式
result = cursor.fetchall()
print(result) # ((4, 2, 3, 87), (8, 3, 3, 48), (12, 1, 2, 48), (13, 1, 3, 59), (14, 2, 1, 98), (15, 3, 1, 68))
# 以此函数获取到第一条返回的内容 返回是元组形式
# fetchone 相当于一个指针,当重复执行时,会依次往下执行
result = cursor.fetchone()
print(result) # (4, 2, 3, 87)
# 以此函数获取到第设置值条返回的内容 返回是元组形式
# 注意此处当设置值多与总行数时,不报错,按实际行数返回
result= cursor.fetchmany(7)
print(result) # ((4, 2, 3, 87), (8, 3, 3, 48), (12, 1, 2, 48), (13, 1, 3, 59), (14, 2, 1, 98), (15, 3, 1, 68))
conn.commit()
cursor.close()
conn.close()
上面说到,fetchone 相当于一个指针,当重复执行时,会依次往下执行,故我们是否同样可以对指针位置进行操作:
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='9999',db='gao')
cursor = conn.cursor()
r=cursor.execute('select * from score')
print(r) # 返回查询内容中的影响到的行数 6
result = cursor.fetchone()
print(result) # (4, 2, 3, 87)
result = cursor.fetchone()
print(result) # (8, 3, 3, 48)
result = cursor.fetchone()
print(result) # (12, 1, 2, 48)
# 依次拿去内容
# 此处改变指针位置
cursor.scroll(0,mode='absolute') # 换到总数据的第0行
result = cursor.fetchone()
print(result) # (4, 2, 3, 87)
result = cursor.fetchone()
print(result) # (8, 3, 3, 48)
# 回到指定位置后,依次拿去内容
# 上位绝对定位方式切换指针 当然存在相对定位方式切换
cursor.scroll(-1,mode='relative') # -1:从现在位置向上一个 1:从现在位置向下一个
result = cursor.fetchone()
print(result) # (8, 3, 3, 48)
result = cursor.fetchone()
print(result) # (12, 1, 2, 48)
result = cursor.fetchone()
print(result) # (13, 1, 3, 59)
# 回到指定位置后,依次拿去内容
conn.commit()
cursor.close()
conn.close()
上述内容中返回的内容均为元组,这样对刚进行数据处理时的人拿到此数据,比较难以对应,故,pymysql也引入了字典形式,同时返回字段名与内容:
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='9999',db='gao')
# 给游标函数里赋值,改变返回内容的类型
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r=cursor.execute('select * from score')
print(r) # 返回查询内容中的影响到的行数 6
result = cursor.fetchall()
print(result) # [{'sid': 4, 'student_id': 2, 'course_id': 3, 'number': 87}, {'sid': 8, 'student_id': 3, 'course_id': 3, 'number': 48}, {'sid': 12, 'student_id': 1, 'course_id': 2, 'number': 48}, {'sid': 13, 'student_id': 1, 'course_id': 3, 'number': 59}, {'sid': 14, 'student_id': 2, 'course_id': 1, 'number': 98}, {'sid': 15, 'student_id': 3, 'course_id': 1, 'number': 68}]
# 这里的字段内容(即字典的key值),同样支持SQL语句中的别名,或指定字段内容等功能
conn.commit()
cursor.close()
conn.close()
当执行一次新增数据时,有时表中具有新增字段,但新增字段不用自己创建,如果有需求获取时,是不用再次查询,可以通过pymysql直接获取的:
原数据库内容
tid | tanme |
---|---|
1 | 波多 |
2 | 苍空 |
3 | 饭岛 |
4 | 苍哈 |
import pymysql
conn = pymysql.connect(host='127.0.0.1',port=3306,user='root',passwd='9999',db='gao')
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
r=cursor.execute('insert into teacher(tname) values("饭岛爱")')
print(r) # 1
tid = cursor.lastrowid # 注意 此函数只能获取到最后一次处理的自增id 前面包含多次处理,也只回复最后一次
print(tid) # 5
conn.commit()
cursor.close()
conn.close()