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('登录失败')
View Code

运行:

第一种情况:
输入:
    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';
    登录成功
View Code

正确的链接数据库姿势:

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')

 

posted @ 2017-11-12 20:08  静静别跑  阅读(203)  评论(0编辑  收藏  举报