为什么这段代码可以在phpadmin/sql中工作,而不能在python代码中工作?

为什么这段代码可以在phpadmin/sql中工作,而不能在python代码中工作?,python,mysql,Python,Mysql,我编写的以下(工作)代码将删除表中的整行重复数据 DELETE t1 FROM table_name t1 INNER JOIN table_name t2 WHERE t1.ID < t2.ID AND t1.FirstName = t2.FirstName AND t1.Surname = t2.Surname AND t1.Size = t2.Size AND t1.Weight = t2.Weight ; 变成

我编写的以下(工作)代码将删除表中的整行重复数据

DELETE t1 FROM table_name t1
INNER JOIN table_name t2 
WHERE 
    t1.ID < t2.ID AND 
    t1.FirstName = t2.FirstName AND
    t1.Surname = t2.Surname AND  
    t1.Size = t2.Size AND
    t1.Weight = t2.Weight ;
    
    
变成:

ID  FirstName       Surname         Size        Weight
2   Paul            Harris          7           11
3   Fred            Flintstone      6           10
4   John            Peterson        6           12
第1行和第4行完全相同,因此只保留最新版本(4)

该代码在我的phpadmin sql查询表单中工作得非常完美。我正在努力让它在我的python代码中工作

这是我的python代码:

cursor.execute("SHOW TABLES")
tables_list=[]
for table in cursor:
    print(table[0])
    tables_list.append(table[0])

if desired_table_name in tables_list:    
    command = "LOCK TABLES " + desired_table_name + " WRITE, t1 WRITE, t2 WRITE"
    cursor.execute(f"{command}")    
    print("locked table")

    command = "DELETE t1 FROM desired_table_name t1 INNER JOIN desired_table_name t2 WHERE t1.ID < t2.ID AND t1.FirstName = t2.FirstName AND t1.Surname = t2.Surname AND t1.Size = t2.Size AND t1.Weight = t2.Weight"

    cursor.execute(f"{command}")
    print(this_bookie_table_changes_name," was deduped")
    cursor.execute("UNLOCK TABLES")
cursor.execute(“显示表”)
表\u列表=[]
对于游标中的表格:
打印(表[0])
表\u list.append(表[0])
如果需要,表格列表中的表格名称:
command=“LOCK TABLES”+所需的表名+“WRITE,t1 WRITE,t2 WRITE”
cursor.execute(f“{command}”)
打印(“锁定表”)
command=“从所需的_表中删除t1_名称t1内部连接所需的_表_名称t2,其中t1.ID
最初它给出了t1和t2在使用前未被锁定的回溯。它们实际上并不存在。我从来没有安排过。所以我输入了一个lock tables命令,现在它正确地抱怨表不存在

我有点迷路了。如何使此代码在python代码中工作。当我在phpadmin sql查询中运行代码时,t1和t2也不存在,它肯定能工作!我怀疑我的问题可以归结为在python和mysql中运行代码有什么不同,它在其中一个中工作,而在另一个中不工作


谢谢

您没有在
命令
中使用
所需的\u table\u name
变量,而是从字面上命名为
所需的\u table\u name
的表中删除。您可以在此处使用f字符串替换变量

    command = "DELETE t1 FROM {desired_table_name} t1 INNER JOIN {desired_table_name} t2 WHERE t1.ID < t2.ID AND t1.FirstName = t2.FirstName AND t1.Surname = t2.Surname AND t1.Size = t2.Size AND t1.Weight = t2.Weight"
公正

    cursor.execute(command)

您没有在
命令
中使用
所需的\u table\u name
变量,而是从字面上命名为
所需的\u table\u name
的表中删除。您可以在此处使用f字符串替换变量

    command = "DELETE t1 FROM {desired_table_name} t1 INNER JOIN {desired_table_name} t2 WHERE t1.ID < t2.ID AND t1.FirstName = t2.FirstName AND t1.Surname = t2.Surname AND t1.Size = t2.Size AND t1.Weight = t2.Weight"
公正

    cursor.execute(command)

我的Python代码看起来像什么?发布它,以及你的异常消息,否则真的很难说。但是,我怀疑您没有提交隐式事务。在这里搜索
[python]commit[mysql]
应该会为您提供更多的背景知识。我还要去掉尾随的
。您是否也在phpmyadmin中锁定了表,或者只是运行了删除代码?您需要锁定
t1
t2
进行读取,锁定
t1
进行写入。您不需要锁定
所需的\u表\u名称
。您可以在PHPadmin中测试锁定。在这种情况下,您无法真正避免字符串连接,因为参数化过程不会处理关键字或表/列名等SQL组件。但是,如果这是一个实时应用程序,并且表名来自不完全受信任的地方,您可能需要检查它们以避免sql注入。我猜,我可能会标记任何不在可接受的表名chars
[a-Za-z0-9\]
中的字符。出于好奇,mysql真的需要在这种上下文中显式锁定吗?在2020年,这似乎过于不稳定。我知道,早在00年代,DB2就倾向于拒绝执行像这样的自引用插入/更新/删除,但那只是在2000年代,只有DB2——不是MSSQL、Oracle,也不是Postgres?发布它,以及你的异常消息,否则真的很难说。但是,我怀疑您没有提交隐式事务。在这里搜索
[python]commit[mysql]
应该会为您提供更多的背景知识。我还要去掉尾随的
。您是否也在phpmyadmin中锁定了表,或者只是运行了删除代码?您需要锁定
t1
t2
进行读取,锁定
t1
进行写入。您不需要锁定
所需的\u表\u名称
。您可以在PHPadmin中测试锁定。在这种情况下,您无法真正避免字符串连接,因为参数化过程不会处理关键字或表/列名等SQL组件。但是,如果这是一个实时应用程序,并且表名来自不完全受信任的地方,您可能需要检查它们以避免sql注入。我猜,我可能会标记任何不在可接受的表名chars
[a-Za-z0-9\]
中的字符。出于好奇,mysql真的需要在这种上下文中显式锁定吗?在2020年,这似乎过于不稳定。我知道,早在00年代,DB2就倾向于拒绝执行像这样的自引用插入/更新/删除,但那只是在2000年代,只有DB2——不是MSSQL、Oracle,也不是Postgres。