pymysql
关于pymysql
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
Django中也可以使用PyMySQL连接MySQL数据库。
安装:
pip install pymysql
注意:
在进行本文以下内容之前需要注意:
• 你有一个MySQL数据库,并且已经启动。
• 你有可以连接该数据库的用户名和密码
• 你有一个有权限操作的database
连接数据库:
方式一:(有bug)
import pymysql inputName = input('name:') inputPwd = input('pwd:') # 连接database conn = pymysql.connect(host="localhost", database="db1", user="root", password="123456", charset="utf8") cursor = conn.cursor() # 得到一个可以执行SQL语句的光标对象 sql = "select * from userinfo where name='%s' and pwd = '%s';" % (inputName, inputPwd) # '%s'这个引号要带上 print(sql) ret = cursor.execute(sql) # 执行SQL语句 cursor.close() # 关闭光标 conn.close() # 关闭数据库连接 if ret: print('登录成功') else: print('登录失败')
运行:
第一种情况: 输入: name: zhou' -- kitty12322343 # 相当于把后面的都给注释了 pwd: abcd 输出: select * from userinfo where name='zhou' -- kitty12322343' and pwd = 'abcd'; 登录成功 第二种情况: 输入: name:kitty' or 1=1 -- haha # 1=1就是True pwd:abcd 输出: select * from userinfo where name='kitty' or 1=1 -- haha' and pwd = 'abcd'; 登录成功
正确的链接数据库姿势:
import pymysql inputName = input('name:') inputPwd = input('pwd:') # 连接database conn = pymysql.connect(host="localhost", database="db1", user="root", password="123456", charset="utf8") cursor = conn.cursor() # 得到一个可以执行SQL语句的光标对象 sql = "select * from userinfo where name=%s and pwd=%s;" # %s也不用加引号了 print(sql) ret = cursor.execute(sql, [inputName, inputPwd]) # 执行SQL语句 # 通过这种方式传参数,就没有bug了 ============================ 字典方式: cursor.execute("select * from userinfo where name=%(user)s and pwd=(pwd)%s;" , {'user'='zhou', 'pwd'='123'} ) ============================ cursor.close() # 关闭光标 conn.close() # 关闭数据库连接 if ret: print('登录成功') else: print('登录失败')
增删改查操作
1、增
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "zhou" age = 18 # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() cursor.close() conn.close()
插入数据失败回滚:
-------------- conn.rollback()
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "zhou" age = 18 try: # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
批量执行操作:
-------------executemany()
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" data = [("zhou", 18), ("zhi", 20), ("long", 21)] try: # 批量执行多条插入SQL语句 cursor.executemany(sql, data) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
获取插入数据的ID(关联表格操作时会用到)
------------- cursor.lastrowid
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);" username = "zhou" age = 18 try: # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() # 提交之后,获取刚插入的数据的ID last_id = cursor.lastrowid except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
2、删
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() sql = "DELETE FROM USER1 WHERE id=%s;" try: cursor.execute(sql, [4]) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
3、改
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 修改数据的SQL语句 sql = "UPDATE USER1 SET age=%s WHERE name=%s;" username = "kitty" age = 88 try: # 执行SQL语句 cursor.execute(sql, [age, username]) # 提交事务 conn.commit() except Exception as e: # 有异常,回滚事务 conn.rollback() cursor.close() conn.close()
4、查
查询单条数据:
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 查询数据的SQL语句 sql = "SELECT id,name,age from USER1 WHERE id=1;" # 执行SQL语句 cursor.execute(sql) # 获取单条查询数据 ret = cursor.fetchone() cursor.close() conn.close() # 打印下查询结果 print(ret) # (1, 'zhou', '123456') 从光标开始处,拿到一条数据,拿到数据后,光标向下移动一行
查询多条数据:
# 导入pymysql模块 import pymysql # 连接database conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”) # 得到一个可以执行SQL语句的光标对象 cursor = conn.cursor() # 查询数据的SQL语句 sql = "SELECT id,name,age from USER1;" # 执行SQL语句 cursor.execute(sql) # 这个得到一个数据总数 # 获取多条查询数据 ret = cursor.fetchall() # 拿到所有的数据 cursor.close() conn.close() # 打印下查询结果 print(ret)
进阶用法:
# 可以获取指定数量的数据 cursor.fetctmany(3) # 从光标开始处,拿到3条数据, 拿到数据后,光标向下移动3行 # 光标按绝对位置移动1 绝对定位:从0开始移动光标 cursor.scroll(1, mode="absolute") 只能是: 正数 # 光标按照相对位置(当前位置)移动1 相对定位:相对于当前光标位置 (默认) cursor.scroll(1, mode="relative") 正数:向下 负数:向上
示例:
import pymysql inputName = input('name:') inputPwd = input('pwd:') conn = pymysql.connect(host="localhost", database="db1", user="root", password="123456", charset="utf8") cursor = conn.cursor() # 得到一个可以执行SQL语句的光标对象 sql = "select * from userinfo;" cursor.execute(sql) ret1 = cursor.fetchmany(3) # 取2个,光标位置准备取第3条数据 cursor.scroll(1,mode='absolute') ret2 = cursor.fetchone() # 光标绝对移动,从0开始移动,所以取第2条数据 cursor.close() # 关闭光标 conn.close() # 关闭数据库连接 print(ret1) # ((1, 'zhou', '123456'), (2, 'long', '123456')), (3, 'zhi', '123456')) print(ret2) # (2, 'long', '123456')