一、连接MySQL服务器
import pymysql
# 连接数据库,调用Connect函数(Connect函数会返回Connection的一个对象)
conn = pymysql.Connect(host='localhost', #主机ip
port=3306, #端口
user='user', #用户名
password='passwd', #密码
database='db', #数据库名称
charset='utf8', #字符集
)
二、对数据库进行操作(增删改查)
mysql> select * from userinfo;
+----+-------+------+
| id | name | pwd |
+----+-------+------+
| 1 | sssss | 123 |
| 2 | abc | 233 |
+----+-------+------+
1.查询(模拟用户登录)
username = input('请输入用户名:')
pwd = input('请输入密码:')
#书写要执行的SQL语句(字符串形式,注意单双引号的使用)
sql = 'select * from userinfo where name="%s" and pwd="%s"'%(username,pwd)
cur = conn.cursor() #调用cursor方法,该方法会返回一个Cursor对象
cur.execute(sql) #调用execute方法执行sql语句 (如果执行成功,这里会返回查询结果数)
cur.close() #关闭
conn.close()
#上述的sql语句存在“漏洞”,如果username输入: xx" or 1=1 -- xxx,这样的骚操作,就可以使用错误的username 并跳过密码,因为相当于执行了select * from userinfo where name=" xx" or 1=1 -- xxx" and pwd="这里随意"这样的语句,1=1是始终成立的,而1=1之后被注释掉了。
username = input('请输入用户名:')
pwd = input('请输入密码:')
sql = 'select * from userinfo where name=%(name)s and pwd=%(pwd)s'
cur.execute(sql,{'name':username,'pwd':pwd}) #防注释处理
cur.close()
conn.close()
2.增删改
mysql> select * from userinfo;
+----+--------+------+
| id | name | pwd |
+----+--------+------+
| 1 | Sroxi | 123 |
| 2 | abc | 233 |
| 3 | QaQ | 306 |
| 4 | Violet | 520 |
+----+--------+------+
#增
cur = conn.cursor()
sql = 'insert into userinfo(username,pwd) valuses(%s,%s)'
cur.execute(sql,(username,pwd))
#cur.executemany(sql,[(username1,pwd1),(username2,pwd2)]) #一次插入多条数据
#改
sql = 'update userinfo set name = %s where id = 1'
cur.execute(sql,username)
#删
sql = 'delete from userinfo where id = 2'
cursor.execute(sql)
conn.commit() #执行增删改等操作后一定要commit,否则操作无效
cursor.close()
conn.close()
3.查:fetchone()、fetchmany()、fetchall()和scroll()
在使用这三个方法之前必须先使用execute(),否则 raise err.ProgrammingError("execute() first"),并且执型的是select语句,它们只能从select 查询得到的临时表中查找。
- fetchone()查询一条记录,并将游标移动到下一行
- fetchall()查询所有数据
- fetchmany(N)查询N条数据
- scroll(value,mode) 移动游标,负值mode ;可以是'relative'或‘absolute’
3.1fetchone()和fetchall()
#默认情况下,我们获取到的返回值是元组,只能看到每行的数据,却不知道每一列代表的是什么,这个时候可以使用以下方式来返回字典,每一行的数据都会生成一个字典:
cur = conn.cursor(cursor=pymysql.cursors.DictCursor)
sql = 'select * from userinfo '
cur.execute(sql)
row = cur.fetchone()
print(row)
row1 = cur.fetchone()
print(row1)
row2 = cur.fetchall()
print(row2)
打印结果:
{'id': 1, 'name': 'Sroxi', 'pwd': '123'}
{'id': 2, 'name': 'abc', 'pwd': '233'}
[{'id': 3, 'name': 'QaQ', 'pwd': '306'}, {'id': 4, 'name': 'Violet', 'pwd': '520'}]
3.2fetchmany()和scroll()
cur.scroll(-2,'relative') #负值向上移动,'relative'表示当前位置,absolute()表示起始位置
row3 = cur.fetchmany(2) #读取两条记录
print(row3)