PyMySQL链接MySQL的一些事务操作

1.在MySQL中创建数据库

"""创建mysql数据库"""
import pymysql
# 数据库连接引用类
from pymysql.connections import Connection
# 游标操作类
from pymysql.cursors import Cursor


# 通过pymysql的方法connect()方法声明一个MySQL连接对象conn。分别传入本地IP、用户名、密码、默认端口
conn = pymysql.connect(host="localhost", user="root", password="yang123", port=3306)
# <class 'pymysql.connections.Connection'>  生成连接对象Connection的实例
print(type(conn))
# 调用连接实例对象的cursor()方法获得MySQL的操作游标
cursor = conn.cursor()
# <class 'pymysql.cursors.Cursor'>   生成游标对象Cursor的实例
print(type(cursor))
# 调用游标实例对象的execute()方法执行sql语句,查看数据库版本
cursor.execute("select version()")
# 调用游标实例对象的fetchone()方法获得数据库版本的信息
data = cursor.fetchone()
# 打印数据库版本信息
print("database version:", data)
# 利用游标执行sql语句创建数据库并设置数据库编码utf8
cursor.execute("create database demo default character set utf8")
# 关闭连接
conn.close()
# 关闭游标
cursor.close()
View Code

2.在数据库创建一张待操作表

# 导入pymysql模块
import pymysql
# 连接database
conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
# 得到一个可以执行SQL语句的光标对象
cursor = conn.cursor()
# 定义要执行的SQL语句
sql = """
CREATE TABLE USER1 (
id INT auto_increment PRIMARY KEY ,
name CHAR(10) NOT NULL UNIQUE,
age TINYINT NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8;
"""
# 执行SQL语句
cursor.execute(sql)
# 关闭光标对象
cursor.close()
# 关闭数据库连接
conn.close()
View Code
# 导入pymysql模块(返回字典格式数据)
import pymysql
# 连接database
conn = pymysql.connect(host=“你的数据库地址”, user=“用户名”,password=“密码”,database=“数据库名”,charset=“utf8”)
# 得到一个可以执行SQL语句并且将结果作为字典返回的游标
cursor = conn.cursor(cursor=pymysql.cursors.DictCursor)
# 定义要执行的SQL语句
sql = """
CREATE TABLE USER1 (
id INT auto_increment PRIMARY KEY ,
name CHAR(10) NOT NULL UNIQUE,
age TINYINT NOT NULL
)ENGINE=innodb DEFAULT CHARSET=utf8;
"""
# 执行SQL语句
cursor.execute(sql)
# 关闭光标对象
cursor.close()
# 关闭数据库连接
conn.close()
View Code

2.1扩展的创建数据库表方法

"""
MySQL数据库中创建表
"""
import pymysql


# 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
# 调用连接实例对象的cursor()方法获得MySQL的操作游标
cursor = db.cursor()
# 编辑创建数据库表的sql语句
sql = "create table if not exists students (id varchar(32) not null, name varchar(64) not null unique, age int not null, primary key (id))"
# 到数据库执行编辑的sql语句
cursor.execute(sql)
# 关闭数据库连接
db.close()
# 关闭游标对象
cursor.close()
View Code

3.向已创建的表中增加数据

# 导入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 = "Alex"
age = 18
# 执行SQL语句
cursor.execute(sql, [username, age])
# 提交事务
conn.commit()
cursor.close()
conn.close()
View Code
# 导入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 = "Alex"
age = 18
try:
    # 执行SQL语句
    cursor.execute(sql, [username, age])
    # 提交事务
    conn.commit()
except Exception as e:
    # 有异常,回滚事务
    conn.rollback()
cursor.close()
conn.close()
View Code
# 导入pymysql模块(获取当前写入数据id,关联操作时会用到)
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 = "Alex"
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()
View Code
# 导入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 = [("Alex", 18), ("Egon", 20), ("Yuan", 21)]
try:
    # 批量执行多条插入SQL语句
    cursor.executemany(sql, data)
    # 提交事务
    conn.commit()
except Exception as e:
    # 有异常,回滚事务
    conn.rollback()
cursor.close()
conn.close()
View Code

3.1插入数据的通用方法

"""
插入数据的通用方法
事务的4个属性
1.原子性:事务是一个不可分割的工作单位,事务中包括的操作要么都做,要么都不做
2.一致性:事务必须使数据库从一个一致性状态表更到另一个一致性状态。一致性与原子性是密切相关的
3.隔离性:一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰
4.持久性:持久性也是永久性。指一个事务一旦提交,它对数据库中的数据改变就是永久性的。接下来的其他操作都不应该对其有任何影响
"""
import pymysql

# 待插入的数据
data = {
'id': '20190116',
'name': 'xia',
'age': 21
}
# 表名
table = "students"
# 构造动态待插入字段的字符串
keys = ", ".join(data.keys())
# 构造将要插入数据的动态字符串
values = ", ".join(["%s"] * len(data))
# 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
# 调用连接实例对象的cursor()方法获得MySQL的操作游标
cursor = db.cursor()
# 通用的sql语句插入方法,根据字典或者元组动态构造数据库插入语句
sql = "INSERT INTO {table}({keys}) VALUES({values})".format(table=table, keys=keys, values=values)
# 采用事务机制,保留操作的原子性。要么失败要么成功,不会出现数据的不完整情况
try:
    # 传入待插入的数据
    if cursor.execute(sql, tuple(data.values())):
        print("成功提交")
    # 提交sql语句到数据库执行
        db.commit()
except:
    # 发生异常事务回滚。相当于什么都没发生过
    db.rollback()
    print("提交失败")
# 关闭连接
db.close()
# 关闭游标对象
cursor.close()
View Code

4.删除表中的数据

# 导入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()
View Code

4.1删除数据的通用方法

"""
数据删除的通用方法
"""
import pymysql


# 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
# 调用连接实例对象的cursor()方法获得MySQL的操作游标
cursor = db.cursor()
# 表名称
table = "students"
# 删除条件。在这里可以有<、>、=、like、and、or等筛选条件
condition = "age>24"
# delete from students where age>24构造的sql语句
sql = "delete from {table} where {condition}".format(table=table, condition=condition)
try:
    # 传入待删除的数据
    cursor.execute(sql)
    # 正式提交sql语句
    db.commit()
except:
    # 发生异常事务回滚。相当于什么都没发生过
    db.rollback()
# 关闭数据库连接
db.close()
# 关闭游标对象
cursor.close()
View Code

5.修改表中的数据

# 导入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 = "Alex"
age = 80
try:
    # 执行SQL语句
    cursor.execute(sql, [age, username])
    # 提交事务
    conn.commit()
except Exception as e:
    # 有异常,回滚事务
    conn.rollback()
cursor.close()
conn.close()
View Code

5.1数据更新的通用方法

"""数据更新的通用方法
实现一种去重的方法,如果数据存在,则更新数据、如果数据不存在,则插入数据
"""
import pymysql

# 待更新的数据
data = {
    "id": "20190112",
    "name": "yang",
    "age": 25
}
# 表名
table = "students"
# 构造动态待更新字段的字符串
keys = ", ".join(data.keys())
# 构造将要更新数据的动态字符串
values = ", ".join(["%s"] * len(data))
# 通用的sql语句更新方法,根据字典或者元组动态构造数据库更新语句
sql = "insert into {table}({keys}) values({values}) on duplicate key update".format(table=table, keys=keys, values=values)
# 构造需要更新的占位符键值对字符串
# 'id=%s, name=%s, age=%s'
update = ",".join([" {key}=%s".format(key=key) for key in data])
# 拼接完整的数据库更新语句
sql += update
print(sql)
# insert into students(id, name, age) values(%s, %s, %s) on duplicate key update id=%s, name=%s, age=%s
# 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
# 调用连接实例对象的cursor()方法获得MySQL的操作游标
cursor = db.cursor()
try:
    # 传入待更新的数据,因为这个sql需要传入两处的占位符,第二个参数则乘以2
    if cursor.execute(sql, tuple(data.values())*2):
        print("提交成功")
        # 正式提交sql语句到数据库执行
        db.commit()
except:
    print("提交失败")
    # 发生异常事务回滚。相当于什么都没发生过
    db.rollback()
# 关闭数据库连接
db.close()
# 关闭游标对象
cursor.close()
View Code

6.查看表中的数据

# 导入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)
View Code

6.1查询数据的推荐方法

"""
数据查询的通用方法
"""
import pymysql


# 通过pymysql的方法connect()方法声明一个MySQL数据库连接对象db。分别传入本地IP、用户名、密码、默认端口和数据库名称
db = pymysql.connect(host="localhost", user="root", password="yang123", port=3306, db="demo")
# 调用连接实例对象的cursor()方法获得MySQL的操作游标
cursor = db.cursor()
# 将要查询的sql语句
sql = "select * from students where age >= 21"
try:
    # 传入待执行的sql语句
    cursor.execute(sql)
    # 打印查询的总数
    print("Count", cursor.rowcount)
    # 查到的第一个数据
    one = cursor.fetchone()
    # 元组的元素跟数据库中表的字段一一对应。第一个元素就是字段id等...
    print("One", one)
    """此方法一次查询所有的数据,如果数据很大占用的开销会很高
    # 因为已查询一个,偏移指针会从第二个开始查询之后所有的数据
    many = cursor.fetchall()
    # Many (('20190113', 'tang', 23), ('20190116', 'xia', 21))
    print("Many", many)
    # 元组包含元组的类型
    print("Many Type", type(many))
    for row in many:
        # 循环取值打印
        print(row)
    """
    # 推荐方法while循环取值
    while one:
        print("One", one)
        one = cursor.fetchone()
except:
    print("Error")
View Code

7.扩展用法和注意事项

# 可以获取指定数量的数据
cursor.fetchmany(3)
# 光标按绝对位置移动1
cursor.scroll(1, mode="absolute")
# 光标按照相对位置(当前位置)移动1
cursor.scroll(1, mode="relative")

SQL注入问题
    1. SQL语句在程序中是字符串,动态拼接的字符串,不要拿用户输入的内容去拼接字符串
    2. 不要自己拼接字符串
View Code

 

转载于:https://www.cnblogs.com/Guishuzhe/p/9820537.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值