草庐IT

Python mysql 不提交

coder 2023-10-12 原文

使用过其他编程/脚本语言后,我对 Python 的 mysql 接口(interface)感到非常困惑(我对 Python 有点陌生)我无法提交更改。我已将代码剥离到最低限度:

#!/usr/bin/python

import mysql.connector as mariadb

mariadb_connection = mariadb.connect(
    user='testdb', 
    password='testdb',
    database='testdb',
    host='127.0.0.1',
    autocommit=True
)
mariadb_connection.autocommit=True
cursor = mariadb_connection.cursor(buffered=True)
cursor.execute( "UPDATE testdb SET descr='konijn' WHERE number=14549")
mariadb_connection.commit()
mariadb_connection.close()

我原以为自动提交会成功,但事实并非如此。此外,mariadb_connection.commit() 不执行任何更改。 数据库是(尽可能相关):

    number      INTEGER,
    type        VARCHAR(255),
    file        VARCHAR(255),
    year        INTEGER,
    month       INTEGER,
    descr       VARCHAR(4096)

我能够使用 TCL/Tk 使用相同的凭据提交更改,因此这不应该是权限问题。

我做错了什么?

最佳答案

服务器重启后(与此无关),我现在无法重现我的问题。一切都按预期工作。我很想知道出了什么问题,但它似乎更像是服务器/配置问题,而不是编程问题。

为了那些偶然发现这个问题寻求智慧的人的利益 (咳咳)对我学到的东西的一个小解释。

与我经常使用的其他语言(Perl、TCL)相反,Python 默认关闭自动提交。此外,mysql CLI 以自动提交启动。但是 Python 的 PEP0249 指出:

Note that if the database supports an auto-commit feature, this must be initially off. An interface method may be provided to turn it back on

.

问题是,如果禁用了自动提交的 session 结束时没有 明确提交最终事务,MySQL 回滚该事务。

所以,你有三个选择:

  • 开启自动提交
  • 明确提交您的更改
  • 丢失您的数据:-)

可以在连接到数据库时直接打开自动提交:

import mysql.connector as mariadb
connection = mariadb.connect(user='testdb', password='testdb',
    database='testdb', host='127.0.0.1',autocommit=True)

或分开:

connection.autocommit=True

显式提交更改已完成

connection.commit()

请注意,提交是通过与数据库的连接完成的,而不是通过游标。

此外,我认为这可能是一个锁定问题,但是有了这个 脚本:

import mysql.connector as mariadb
number=input('->')
mariadb_connection = mariadb.connect(user='testdb', password='testdb',database='testdb', host='127.0.0.1')
cursor = mariadb_connection.cursor(buffered=True)
cursor.execute( "UPDATE testdb SET descr='konijntje' WHERE number=%s",(number,))
print 'rowcount',cursor.rowcount
number=input('->')
mariadb_connection.commit()
mariadb_connection.close()

我可以验证对同一条记录的第二次启动是否会等到第一次释放锁。

非常感谢您的时间、耐心和保证,我的代码并没有我想象的那么错误。

关于Python mysql 不提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47857632/

有关Python mysql 不提交的更多相关文章

  1. git使用常见问题(提交代码,合并冲突) - 2

    文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g

  2. ruby-on-rails - 如何在 Rails 中添加禁用的提交按钮 - 2

    我在ruby​​表单中有一个提交按钮f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id"我想在不使用任何javascript的情况下通过ruby​​禁用此按钮 最佳答案 添加disabled:true选项。f.submitbtn_text,class:"btnbtn-onemgt12mgb12",id:"btn_id",disabled:true 关于ruby-on-rails-如何在Rails中添加禁用的提交按钮,我们在St

  3. ruby-on-rails - 在 rails 中提交后回滚事务 - 2

    保存成功后可以回滚吗?让我有一个带有属性名称、电子邮件等的用户模型。例如u=User.newu.name="test_name"u.email="test@email.com"u.save现在记录将成功保存在数据库中,之后我想回滚我的事务(不是销毁或删除)。有什么想法吗? 最佳答案 您可以通过交易来做到这一点,请参阅http://markdaggett.com/blog/2011/12/01/transactions-in-rails/例子:User.transactiondoUser.create(:username=>'Nemu

  4. ruby - 如何以编程方式使用 Rugged 创建提交? - 2

    我正在尝试使用Rugged以编程方式创建对现有存储库的提交(libgit2的Ruby绑定(bind))。我已尝试遵循RuggedREADME中提供的文档,但我认为它与代码库的当前状态不太匹配。当我尝试运行以下代码时,我不断收到错误消息:require'rugged'#Createaninstanceoftheexistingrepositoryrepo=Rugged::Repository.new('/full/path/to/repo')#grabthecurrentTimeobjectfornowcurr_time=Time.now#writeanewblobtothereposi

  5. ruby - git:从 bitbucket 导出并导入 github(带提交) - 2

    我在bitbucket上创建了一个私有(private)git存储库并提交了代码。现在我想导出所有(提交、代码、历史记录)并将其导入github上的gitrepo。有没有办法做到这一点?谢谢 最佳答案 在本地检查所有内容到您的计算机和gitpull。创建一个github存储库将此存储库添加为您的第二个远程(“使用gitremote添加githubURL”)推送到第二个Remote 关于ruby-git:从bitbucket导出并导入github(带提交),我们在StackOverflow

  6. ruby-on-rails - 常量化通过浏览器提交的参数是不好的做法吗? - 2

    我有一个单表继承设置,我有一个Controller(我觉得有多个Controller会重复)。但是,对于某些方法,我想调用模型的子类。我想我可以让浏览器发送一个参数,我会针对该参数编写一个case语句。像这样的东西:case@model[:type]when"A"@results=Subclass1.search(params[:term])when"B"@results=Subclass2.search(params[:term])...end或者,我了解到Ruby的所有技巧都可以用字符串创建模型。像这样的东西:@results=params[:model].constantize.

  7. ruby - 从用户提交的文本中提取关键字的好方法是什么? - 2

    我正在构建一个网站,该网站允许用户通过以图形方式表示支持和反对特定问题的论点来理解辩论。(Wrangl)我想对这些辩论进行分类,以便更容易找到它们并将它们联系起来。我不想让发起辩论的人在他们看到任何好处之前添加标签和类别,从而激怒他们,所以我正在寻找一种自动提取关键字的方法。有什么好的方法可以利用辩论的标题和描述(以及可能的论点本身的内容,一旦有的话)来提取,比如说,可以用作元数据将类似辩论联系在一起的十个强关键字,或者即使是在可以查看辩论的HTML页面头部的“元”关键字标记的内容。例如。DatamappervsActiveRecord该网站使用Ruby和Sinatra编码,使用Dat

  8. ruby-on-rails - Rails,如何提交带有文本链接的表单? - 2

    我正在尝试让此表单正确提交。这是我到目前为止所拥有的:update_user_setting_path,:remote=>true,:html=>{:method=>:post,:class=>"search_formgeneral_form"})do|f|%>按钮用这段代码呈现:SAVE"),:action=>'create'%>我正在使用actioncreate,这是否正确?这是呈现的表单标签:我错过了什么?感谢您的帮助! 最佳答案 不,您没有正确使用link_to。您需要使用submit标签来提交您的表单,而不是link_to

  9. ruby-on-rails - 如何使用私有(private)提交隐藏提要? - 2

    在评估表单中有一个提交按钮和一个按钮。如果点击私有(private)提交,提交的信息将对查看个人资料的其他用户隐藏。我们怎样才能同时使用隐藏提交的信息以防止在提要上显示?activities/index.html.erbFeed#We'dneedtomake.public_valuationsworkwiththiswithoutgettinganundefinedmethoderror.activities_controller.rbclassActivitiesController为简洁起见,我将只包含_create(还有update和destroy)。每次用户提交估价时,它都会在

  10. ruby-on-rails - 在 rails 中单击提交打开一个新窗口 - 2

    您好,我想使用ruby​​onrails在单击提交按钮时打开新窗口,这是我的代码'btnbtn-mdbtn-success'do%>CreateNewWindow我试过:target=>"_blank"提交,但它不起作用,请帮助我 最佳答案 使用formtarget="_blank"。'btnbtn-mdbtn-success',:formtarget=>"_blank"do%>CreateNewWindow此链接将为您提供帮助http://www.w3schools.com/tags/att_button_formtarget.a

随机推荐