【问题标题】:Why does PyMySQL delete query execute but does not delete records without error?为什么 PyMySQL 删除查询执行但没有错误地删除记录?
【发布时间】:2018-11-20 06:54:46
【问题描述】:

问题:

我正在尝试通过我的函数 delEODTmp 使用 pymysql 运行删除查询,但它没有做任何事情(即删除记录)。它也不会抛出任何错误,因此很难理解它为什么不工作。

疑难解答:

1) 函数 retSQL 就像一个魅力,检索我扔给它的任何 Select 字符串。这确认我的用户登录设置正确输入到pymysql.connect。我正在从客户端到同一网络上的Mysql 5.7 server 执行此操作。

2) 在同一个客户端上,我可以使用相同的凭据连接到同一台服务器:

  • workbench 成功运行SQL DELETE FROM t_EOD_tmp;
  • phpMyAdmin成功运行SQL DELETE FROM t_EOD_tmp;

3) 我尝试在服务器本地运行 py 脚本,但删除查询仍然不起作用。与客户的结果相同。

问题:

似乎破坏性查询在从 PyMySQL 执行时被阻止。 我是否需要从 Python 或 MySQL 启用某些功能?

似乎没有关于 PyMySQL 的广泛文档,所以也许通过不同的 MySQL Python 库进行开发会更好。有没有更好的办法?

代码:

import pymysql
import pandas

    query1 = '''SELECT * FROM t_EOD limit 1000;'''

    def retSQL(query):
    conn = pymysql.connect(host=myServer, port=myPort, user=myUsr, password=myPwd, db=myDB)
    df = pd.read_sql(query,conn)
    print(df.head(5)) 
    conn.close() # closeSQL connection

def delEODTmp():
    conn = pymysql.connect(host=myServer, port=myPort, user=myUsr, password=myPwd, db=myDB)
    cur = conn.cursor()
    q1 = '''DELETE FROM t_EOD_tmp;'''
    cur.execute(q1) 
        cur.close()
        conn.close()

retSQL(query1)
delEODTmp()

【问题讨论】:

  • 在关闭之前记得conn.commit()

标签: python mysql phpmyadmin mysql-workbench


【解决方案1】:

您必须在关闭连接之前提交更改:

conn.commit()

【讨论】:

  • 好的很好 - 现在很好。在 conn.commit 上找到这篇文章,解释了为什么需要 link
【解决方案2】:

查询执行后,我认为您必须调用提交才能将更改应用到数据库。

    @staticmethod
    def delete(query=None):
        """
        This methods deletes the record
        :param query:
        :return:
        """
        try:
            db.query(Users).\
                filter_by(**query).\
                delete()
            db.commit()
        except Exception as e:
            db.rollback()
            raise Exception(e.message)

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 2023-01-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多