目录
1.在Python中安装pymysql
2.创建数据
1.连接数据库,创建一个数据库对象
2.开启游标功能,创建游标对象
3.发送指令
获取查询结果集的方法
4.实操
5.注意
不可以!!!
正确写法
6.用户输入数据
3.查询数据
4.增、删、改数据
1.在Python中安装pymysql
pip3.9 install pymysql
2.创建数据
参数 | 描述 |
---|---|
host | 可选。规定主机名或 IP 地址。 |
username | 可选。规定 MySQL 用户名。 |
password(passwd) | 可选。规定 MySQL 密码。 |
database(db) | 可选。规定默认使用的数据库。(所用的数据库名) |
port | 可选。规定尝试连接到 MySQL 服务器的端口号。 |
socket | 可选。规定 socket 或要使用的已命名 pipe。 |
1.连接数据库,创建一个数据库对象
conn=pymysql.connect(
host="localhost",
port=3306,
user="root",
db="case",
passwd="cheng0214",
charset="utf8"
)
2.开启游标功能,创建游标对象
- 在使用pymysql.connect() 方法与数据库建立连接后,想要操作数据库时,就需要使用游标 Cursor通过连接好的数据库(此处为conn,该处的名称可自己决定)调用 cursor() 方法即可返回一个新的游标对象,在连接没有关闭之前,游标对象可以反复使用
# 这里使用的是数据库对象conn中的cursor()方法,
cursor = conn.cursor()
# 这个语句使用了pymysql库中的cursor方法来创建一个字典类型的游标对象。这个游标对象可以用来执行SQL查询,并将结果以字典的形式返回。
cursor = conn.cursor(cursor=pymysql.cursor.DictCursor)
- 游标类型
类型 | 描述 |
Cursor | 普通的游标对象,默认创建的游标对象 |
SSCursor | 不缓存游标,主要用于当操作需要返回大量数据的时候 |
DictCursor | 以字典的形式返回操作结果 |
SSDictCursor | 不缓存游标,将结果以字典的形式进行返回 |
3.发送指令
- 调用 cursor.execute(sql) 方法查询数据
获取查询结果集的方法
Connection类提供了三个方法: begin 开始事务, commit 提交事务, rollback 回滚事务,如果通过 sql 语句对数据库中的数据进行了修改, 则需要提交事务。
db.commit()
这是一个Python中的数据库操作函数。它通常用于提交事务,将所有在事务内进行的修改永久保存到数据库中。在执行INSERT、DELETE、UPDATE等操作时,必须使用该函数才能使操作生效。如果不提交,所有的修改将不会被保存。
4.实操
import pymysql
# 1.连接MySQL (connect)连接
conn=pymysql.connect(
host="localhost",
port=3306,
user="root",
db="case",
passwd="cheng0214",
charset="utf8")
# 创建连接,创建游标(cursor),基于cursor发送指令,用游标execute执行sql语句,然后断开连接
cursor=conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
# 只是生成了命令,没有提交
cursor.execute("insert into admin(username,password,mobile) value ('cheng','123','1507')")
# 所以需要commit提交一下,也可以在db=‘’后面加,autocommit=True 这样不写commit()也是可以的
conn.commit()
# 3.关闭
cursor.close()
conn.close()
5.注意
不可以!!!
# 千万不要用字符串格式化去做SQL的拼接,安全隐患SQL注入
sql="insert into admin(username,password,mobile) value ('cheng','123','1507')"
cursor.execute(sql)
conn.commit()
正确写法
sql="insert into admin(username,password,mobile) value (%s,%s,%s)"
cursor.execute(sql,["cheng","123","1507"])
conn.commit()
sql="insert into admin(username,password,mobile) value (%(n1)s,%(n2)s,%(n3)s)"
cursor.execute(sql, {"n1":"cheng","n2":"123","n3":"1507"})
conn.commit()
6.用户输入数据
import pymysql
while True:
user = input("用户名:")
if user.upper()=='Q':
break
pwd = input("密码:")
mobile = input("手机号:")
# 1.连接MySQL (connect)连接
conn = pymysql.connect(
host="localhost",
port=3306,
user="root",
db="case",
passwd="cheng0214",
charset="utf8")
# 创建连接,创建游标(cursor),基于cursor发送指令,用游标execute执行sql语句,然后断开连接
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
# 只是生成了命令,没有提交
sql = "insert into admin(username,password,mobile) value (%s,%s,%s)"
cursor.execute(sql, [user,pwd,mobile])
conn.commit()
# 3.关闭
cursor.close()
conn.close()
user.upper():upper() 方法将字符串中的小写字母转为大写字母。
3.查询数据
import pymysql
# 1.连接MySQL
conn = pymysql.connect(
host="localhost",
port=3306,
user="root",
db="case",
passwd="cheng0214",
charset="utf8")
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 2.发送指令
sql = "select * from admin"
cursor.execute(sql)
data_list=cursor.fetchall()
print(data_list)
# 3.关闭
cursor.close()
conn.close()
print(data_list): 返回的是字典
for row_dict in data_list:
print(row_dict)
- 当调用 cursor.execute(sql) 方法查询数据的时候,如果执行成功,获取查询的结果集的方法有
名称 | 说明 |
fetchall() | 返回剩下的所有行,如果走到末尾,就返回空元组,否则返回一个元组,其元素是每一行的记录封装的一个元组(得到的是:{字典,字典}或者空列表) |
fetchone() | 获取结果集的下一行(得到的是:字典或者None) |
fetchmany(size=None) | size指定返回的行数,None则返回空元组 |
cursor.rownumber | 返回当前行号.可以修改,支持负数 |
cursor.rowcount | 返回的总行数 |
4.增、删、改数据
- 在进行新增、删除、修改时,一定要记得commit,不然数据库么有数据。
sql = "..."
cursor.execute(sql)
conn.commit()
- 在查询时,不需要commit,执行fetchall / fetchone
cursor.execute("...")
# 第一条数据,字典,无数据时是空列表
vl = cursor.fetchone()
# 所有数据,列表套字典,无数据时是None
vl = cursor.fetchall()
- 对于SQL语句不要用Python的字符串格式化进行拼接(会被SQL注入),一定要用execute+参数
cursor.execute(".%s.......%s",["xx","xx"])