建议如何在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
?
解决方案
我要创建一个存储过程:
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)
保持简单和模块化。当然,您应该执行某种类型的错误检查,甚至可以让存储过程返回一个代码来指示成功或失败。
相关文章