鱼C论坛

 找回密码
 立即注册
查看: 2618|回复: 5

[技术交流] 关于python增删查改疑问.commit()

[复制链接]
发表于 2020-9-24 15:50:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 CH10 于 2020-9-25 11:39 编辑

找到答案了:
aiomysql.connect() 的参数中有一个 autocommit 参数,默认为 False, 你可以把它设置为 True, 这样就不需要手动调用 connection.commit() 了。
每次执行增删改都要加一句.commit()太麻烦了,用参数改成自动舒服
 conn = await aiomysql.connect(
        host='127.0.0.1', 
        port=3306, 
        user='root', 
        password='password', 
        db='test', 
        autocommit=True,
        loop=loop)

g_pool = await aiomysql.create_pool(
        host='127.0.0.1', 
        port=3306, 
        user='root', 
        password='password', 
        db='test', 
        autocommit=True,
        minsize=1,
        maxsize=10, 
        loop=loop)


为什么查询数据库的时候,cursor.execute(sql)执行sql语句,直接就有结果,不需要db.commit()
而增删改,都需要加db.commit()这一句,数据库才会执行增删改操作,不加db.commit()这一句程序不会报错但数据库就是不会进行操作,看了各类教程都没有关于这一点的解释


刚找到了以下下资料
在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
事务用来管理 insert,update,delete 语句

MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

更新一下问题:
数据库那里默认好像也是自动提交的啊,为什么还需要db.commit()语句,python和直接在 MySQL 命令行下执行为什么不一样???
Database changed
MariaDB [test]> show variables like '%autocommit%';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

python 查询数据库
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 查询语句
sql = "SELECT * FROM EMPLOYEE \
       WHERE INCOME > %s" % (1000)
try:
   # 执行SQL语句
   cursor.execute(sql)
   # 获取所有记录列表
   results = cursor.fetchall()
   for row in results:
      fname = row[0]
      lname = row[1]
      age = row[2]
      sex = row[3]
      income = row[4]
      # 打印结果
      print "fname=%s,lname=%s,age=%s,sex=%s,income=%s" % \
             (fname, lname, age, sex, income )
except:
   print "Error: unable to fecth data"

# 关闭数据库连接
db.close()
python插入数据库
#!/usr/bin/python
# -*- coding: UTF-8 -*-

import MySQLdb

# 打开数据库连接
db = MySQLdb.connect("localhost", "testuser", "test123", "TESTDB", charset='utf8' )

# 使用cursor()方法获取操作游标 
cursor = db.cursor()

# SQL 插入语句
sql = """INSERT INTO EMPLOYEE(FIRST_NAME,
         LAST_NAME, AGE, SEX, INCOME)
         VALUES ('Mac', 'Mohan', 20, 'M', 2000)"""
try:
   # 执行sql语句
   cursor.execute(sql)
   # 提交到数据库执行
   db.commit()
except:
   # Rollback in case there is any error
   db.rollback()

# 关闭数据库连接
db.close()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-9-24 15:53:48 | 显示全部楼层
个人理解: 查询一类的 不涉及到 数据库内容变化的   不需要提交
    而删除 增加  修改一类的   需要改变数据库内容,所以需要提交   
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-24 15:59:39 | 显示全部楼层
wp231957 发表于 2020-9-24 15:53
个人理解: 查询一类的 不涉及到 数据库内容变化的   不需要提交
    而删除 增加  修改一类的   需要改变 ...


这可以很容易想到,但有没有相关的资料、教程、文档之类的讲到这一点
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-24 16:00:35 | 显示全部楼层
实际上这是数据库的问题
建议找本数据库系统概论看看 了解一下事务
以下为commit的用途
使用COMMIT提交当前事务,使事务中执行的变更永久化,所有事务的更改都将为其他事务可见,而且保证当崩溃发生时的可持续性;
通过修改的表,查看事务期间所作的任何更改,但其他用户不能看到所做的更改;
可以回滚 ROLLBACK语句与事务过程中所做的任何更改;
可以使用此语句手动提交疑问在分布式的事务上;
可以使用此语句终止SET TRANSACTION语句的只读事务;
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-9-24 16:07:45 | 显示全部楼层
mrcrisis 发表于 2020-9-24 16:00
实际上这是数据库的问题
建议找本数据库系统概论看看 了解一下事务
以下为commit的用途

我学过数据库,commit我记得是用于提交事务的,提交事务总得开启事务把,python这里我都不知道什么时候开启了事务
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-9-24 16:53:38 | 显示全部楼层
https://www.cnblogs.com/catroll/archive/2013/08/30/python_mysqldb_autocommit.html

是 MySQLdb 的问题,在日志文件中仔细的看了一遍运行的所有sql 语句,在建立连接之后还运行了这句:set autocommit=0。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-1-18 14:01

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表