python操作mysql

安装pymysql

pip install PyMySQL
pip命令将PyMySQL安装在 Python的安装目录中
\Python36\Lib\site-packages\PyMySQL-0.8.1.dist-info

使用 PyMySQL的前提
1.您已经创建了数据库。
2.拥有访问数据库的帐号和密码,并且连接数据库具备访问权限。
3.在你的电脑上已经安装了 Python pymysql 模块。
4.必须熟练使用SQL语句。

数据库连接对象使用

1.引入PyMySQL模块
2.使用connect方法连接数据库
3.通过cursor方法创建一个游标对象
4.通过游标执行SQL语句
5.从游标执行结果中读取数据



import pymysql

1. 创建连接对象
    语法:
    连接对象 = pymysql.connect(
    host="连接地址 localhost, ip 地址",
    port=端口号,默认3306,
    user="用户名",
    password="密码",
    database="数据库名",
    charset="utf8"
    )

2. 使用连接对象
    a. 创建游标对象
        游标对象 = 连接对象.cursor(cursor=None)
        参数说明: 指定游标的类型
        `Cursor`: 默认
        `SSCursor`: 默认基础上采用生成器
        `DictCursor`: 字典类型游标
        `SSDictCursor`: 在字典采用生成器方式

        例如: cnn.cursor(cursor=pymysql.cursors.SSDictCursor)

    b. 切换数据库
        数据库连接对象.select_db(数据库名)

    c. 关闭连接
        连接对象.close()
            
            

例子:
# 创建连接对象
import pymysql
from pymysql.cursors import SSCursor

# from config import db
# print(db)
#cnn = pymysql.connect(**db) # 创建连接对象
# cnn.select_db("test") # 切换数据库
# print(cnn)
cnn = pymysql.connect(
     host="localhost",
     port=3306,
     user="root",
     password="root",
     database="itsource",
     charset="utf8"
 )

# 创建游标对象
cursor = cnn.cursor(cursor=pymysql.cursors.SSDictCursor) # alt + enter 反向导入模块

# 准备sql
sql = "select * from student"

# 执行sql,发送
cursor.execute(sql)

# 使用游标获取数据
data = cursor.fetchall()
print(data)


# 关闭连接
cursor.close()# 先关闭游标对象
cnn.close()#再关闭连接对象

游标对象使用–%s占位符sql使用

1. 游标对象用于执行sql语句
    语法:
        游标对象.execute(sql,args=None)
    传参数的方式说明:
        1. 如果是完整的sql语句, 就直接传第一个参数即可
            备注: 如果通过传入的形式拼接的sql语句,容易造成sql注入的风险.
            sql注入: 恶意用户构建特殊sql参数传入,从而非法获取数据.

        2. 如果sql语句是使用 %s 占位的时候,必须使用第二个参数args(实际的数据)
            例子: sql = "select * from student where name=%s and age=%s"
                  args =  ["张飞",51] #列表或者元组
                  游标对象.execute(sql,args)

    了解:
        游标对象.executemany(sql,args=[(数据1,数据2),(数据1,数据2),(数据1,数据2)])
        同一条sql执行多次

2. 游标对象获取数据
    游标对象.fetchall(): 获取所有
    游标对象.fetchone(): 获取下一条(每执行一次获取一条)
    游标对象.fetchmany(number): 获取指定条数据

3. 游标的关闭
    游标对象.close()

    备注: 建议每次使用完游标执行和获取数据之后立马关闭游标

    提供一个上下文管理器的语法, 自动关闭(任何打开的东西)
    with 连接对象.cursor() as cursor:
        # 使用游标cursor  执行和获取数据, 自动关闭游标

    文件操作
    with open("./data.txt","r",encoding="utf-8") as fp:
        fp.read()
        
例子1:
# 导入pymysql
import pymysql
from config import db

# 创建连接对象
cnn = pymysql.connect(**db)
# 通过连接对象创建游标对象
cursor = cnn.cursor(cursor=pymysql.cursors.DictCursor)


# %s 占位的sql语句
name = input("请输入姓名:") 
age = input("请输入年龄:")
sql = "select * from student where name=%s and age=%s"
args = [name,age]
cursor.execute(sql,args)




例子2:
# 用户传入姓名和年龄,不使用占位符会导致sql注入风险
name = input("请输入姓名:") # 'or 1 or' 'or 1 #
age = input("请输入年龄:")
sql = "select * from student where name='{}' and age={}".format(name,age) #完整的sql语句
print(sql)
cursor.execute(sql)


# 获取数据
data = cursor.fetchall()
print(data)
data = cursor.fetchone()
print(data)
data = cursor.fetchmany(5)
print(data)
print(len(data))

游标对象使用–添加多条数据executemany

# 导入pymysql
import pymysql
from config import db

# 创建连接对象
cnn = pymysql.connect(**db)
# 通过连接对象创建游标对象
cursor = cnn.cursor(cursor=pymysql.cursors.DictCursor)

# 准备sql
sql = "insert into student(name,age,sex,class_id,money) values (%s,%s,%s,%s,%s)"
args = [
    ("小黄黄1", 25, "男", 2, 250),
    ("小黄黄2", 25, "男", 2, 250),
    ("小黄黄3", 25, "男", 2, 250)
]
# 一次执行多条数据
num = cursor.executemany(sql, args)
print(num)
if num > 0:
    # 提交事务
    cnn.commit()
    print("添加成功!")

事务使用

d. 事务操作的方法
        连接对象.begin(): 开启事务,默认开启
        连接对象.commit(): 提交事务
        连接对象.rollback(): 回滚事务

        注意: pymysql 鉴于安全考虑,所有的写(insert,delete,update)操作都必须使用事务
            
例子:           
# 导入
import pymysql
from config import db

# 创建连接对象
cnn = pymysql.connect(**db)

try:
    # 创建游标对象
    with cnn.cursor(cursor=pymysql.cursors.DictCursor) as cursor:
        # 准备sql语句
        # 猪八戒少200
        sql_1 = "update student set money=money-200 where name=%s"
        args_1 = ["猪八戒1"]
        num = cursor.execute(sql_1, args_1)  # 返回受影响的行数
        if num == 0:  # 转账失败!
            # 手动抛出异常
            raise Exception("该用户不存在!")

        # 貂蝉多200
        sql_2 = "update student set money=money+200 where name=%s"
        args_2 = ["貂蝉"]
        num = cursor.execute(sql_2, args_2)
        if num == 0:  # 转账失败!
            # 手动抛出异常
            raise Exception("该用户不存在!")

    # 提交事务
    cnn.commit()
    print("转账成功!")
except Exception as e:
    # 出现异常说明转账失败, 应该回滚事务
    cnn.rollback()
    print("转账失败!", e)       
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值