在 python 中运行多个 sql 语句的建议方法?

新手上路,请多包涵

在 python 中运行类似以下内容的建议方法是什么:

 self.cursor.execute('SET FOREIGN_KEY_CHECKS=0; DROP TABLE IF EXISTS %s; SET FOREIGN_KEY_CHECKS=1' % (table_name,))

例如,这应该是三个独立的 self.cursor.execute(...) 语句吗?除了 cursor.execute(...) 之外,是否应该使用特定的方法来做这样的事情,或者建议的做法是什么?目前我的代码如下:

 self.cursor.execute('SET FOREIGN_KEY_CHECKS=0;')
self.cursor.execute('DROP TABLE IF EXISTS %s;' % (table_name,))
self.cursor.execute('SET FOREIGN_KEY_CHECKS=1;')
self.cursor.execute('CREATE TABLE %s select * from mytable;' % (table_name,))

如您所见,一切都是单独运行的……所以我不确定这是否是个好主意(或者更确切地说,执行上述操作的最佳方法是什么)。也许 BEGIN...END

原文由 David542 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 615
2 个回答

我会创建一个存储过程:

 DROP PROCEDURE IF EXISTS CopyTable;
DELIMITER $$
CREATE PROCEDURE CopyTable(IN _mytable VARCHAR(64), _table_name VARCHAR(64))
BEGIN
    SET FOREIGN_KEY_CHECKS=0;
    SET @stmt = CONCAT('DROP TABLE IF EXISTS ',_table_name);
    PREPARE stmt1 FROM @stmt;
    EXECUTE stmt1;
    SET FOREIGN_KEY_CHECKS=1;
    SET @stmt = CONCAT('CREATE TABLE ',_table_name,' as select * from ', _mytable);
    PREPARE stmt1 FROM @stmt;
    EXECUTE stmt1;
    DEALLOCATE PREPARE stmt1;
END$$
DELIMITER ;

然后运行:

 args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)

保持简单和模块化。当然,您应该进行某种错误检查,您甚至可以让存储过程返回一个代码来指示成功或失败。

原文由 Dan M 发布,翻译遵循 CC BY-SA 4.0 许可协议

MySQLCursor.execute() 的文档中,他们建议使用 multi=True 参数:

 operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
for result in cursor.execute(operation, multi=True):
    ...

您可以在模块的源代码中找到 另一个示例

原文由 Yam Mesicka 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题