关于pymysql
PyMySQL 是在 Python3.x 版本中用于连接 MySQL 服务器的一个库,Python2中则使用mysqldb。
Django中也可以使用PyMySQL连接MySQL数据库。安装:
pip install pymysql
注意:
在进行本文以下内容之前需要注意:
• 你有一个MySQL数据库,并且已经启动。 • 你有可以连接该数据库的用户名和密码 • 你有一个有权限操作的database连接数据库:
方式一:(有bug)
import pymysqlinputName = input('name:')inputPwd = input('pwd:')# 连接databaseconn = 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 pymysqlinputName = input('name:')inputPwd = input('pwd:')# 连接databaseconn = 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# 连接databaseconn = 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# 连接databaseconn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到一个可以执行SQL语句的光标对象cursor = conn.cursor()sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"username = "zhou"age = 18try: # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit()except Exception as e: # 有异常,回滚事务 conn.rollback()cursor.close()conn.close()
批量执行操作:
-------------executemany()# 导入pymysql模块import pymysql# 连接databaseconn = 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# 连接databaseconn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)# 得到一个可以执行SQL语句的光标对象cursor = conn.cursor()sql = "INSERT INTO USER1(name, age) VALUES (%s, %s);"username = "zhou"age = 18try: # 执行SQL语句 cursor.execute(sql, [username, age]) # 提交事务 conn.commit() # 提交之后,获取刚插入的数据的ID last_id = cursor.lastrowidexcept Exception as e: # 有异常,回滚事务 conn.rollback()cursor.close()conn.close()
2、删
# 导入pymysql模块import pymysql# 连接databaseconn = 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# 连接databaseconn = 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 = 88try: # 执行SQL语句 cursor.execute(sql, [age, username]) # 提交事务 conn.commit()except Exception as e: # 有异常,回滚事务 conn.rollback()cursor.close()conn.close()
4、查
查询单条数据:
# 导入pymysql模块import pymysql# 连接databaseconn = 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# 连接databaseconn = 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 pymysqlinputName = 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')