Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

Điều gì sẽ là cách được đề xuất để chạy một cái gì đó như sau trong Python:

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

Ví dụ, đây có nên là ba câu

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,))
9 riêng biệt? Có một phương pháp cụ thể nào nên được sử dụng ngoài
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 ;
0 để làm điều gì đó như thế này, hoặc thực tế được đề xuất để làm điều này là gì? Hiện tại mã tôi có như sau:

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,))

Như bạn có thể thấy, mọi thứ được chạy riêng biệt ... vì vậy tôi không chắc đây có phải là một ý tưởng hay hay không (hay đúng hơn - cách tốt nhất để làm những điều trên là như thế nào). Có lẽ

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 ;
1?

Đã hỏi ngày 25 tháng 6 năm 2020 lúc 21:31Jun 25, 2020 at 21:31

Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

David542David542David542

105K164 Huy hiệu vàng448 Huy hiệu bạc769 Huy hiệu đồng164 gold badges448 silver badges769 bronze badges

6

Tôi sẽ tạo một thủ tục được lưu trữ:

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 ;

Và sau đó chỉ cần chạy:

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

Giữ nó đơn giản và mô -đun. Tất nhiên bạn nên thực hiện một số loại kiểm tra lỗi và bạn thậm chí có thể có quy trình được lưu trữ trả về một mã để chỉ ra thành công hay thất bại.

Đã trả lời ngày 4 tháng 7 năm 2020 lúc 19:27Jul 4, 2020 at 19:27

Dan mdan mDan M

4.3977 Huy hiệu bạc20 Huy hiệu Đồng7 silver badges20 bronze badges

4

Trong tài liệu của

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 ;
2, họ đề nghị sử dụng tham số
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 ;
3:

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

Bạn có thể tìm thấy một ví dụ khác trong mã nguồn của mô -đun.

Đã trả lời ngày 28 tháng 6 năm 2020 lúc 7:37Jun 28, 2020 at 7:37

Yam Mesickayam MesickaYam Mesicka

6,0037 Huy hiệu vàng45 Huy hiệu bạc63 Huy hiệu Đồng7 gold badges45 silver badges63 bronze badges

Tôi sẽ không dựa vào bất kỳ tham số

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 ;
3 nào của hàm
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 ;
5, điều này rất phụ thuộc trình điều khiển cũng như không cố gắng chia một chuỗi trên ký tự
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 ;
6, có thể được nhúng theo chữ theo chuỗi. Cách tiếp cận đơn giản nhất sẽ là tạo một hàm,
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 ;
7, lấy một danh sách các câu lệnh được thực thi và tham số
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 ;
8 để xác định hành động nào được thực hiện nếu có bất kỳ câu lệnh nào dẫn đến ngoại lệ.

Kinh nghiệm của tôi với MySQLDB và PYMYSQL theo mặc định, họ bắt đầu trong

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 ;
9, nói cách khác như thể bạn đã có một giao dịch và cần có cam kết rõ ràng. Dù sao, giả định đó giữ cho mã dưới đây. Nếu đó không phải là trường hợp, thì bạn nên 1. Đặt rõ ràng
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 ;
9 sau khi kết nối hoặc 2. Sửa đổi mã này để bắt đầu giao dịch theo câu lệnh
args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
1

def execute_multiple(conn, statements, rollback_on_error=True):
    """
    Execute multiple SQL statements and returns the cursor from the last executed statement.

    :param conn: The connection to the database
    :type conn: Database connection

    :param statements: The statements to be executed
    :type statements: A list of strings

    :param: rollback_on_error: Flag to indicate action to be taken on an exception
    :type rollback_on_error: bool

    :returns cursor from the last statement executed
    :rtype cursor
    """

    try:
        cursor = conn.cursor()
        for statement in statements:
            cursor.execute(statement)
            if not rollback_on_error:
                conn.commit() # commit on each statement
    except Exception as e:
        if rollback_on_error:
            conn.rollback()
        raise
    else:
        if rollback_on_error:
            conn.commit() # then commit only after all statements have completed successfully

Bạn cũng có thể có một phiên bản xử lý các câu lệnh đã chuẩn bị với danh sách tham số của nó:

def execute_multiple_prepared(conn, statements_and_values, rollback_on_error=True):
    """
    Execute multiple SQL statements and returns the cursor from the last executed statement.

    :param conn: The connection to the database
    :type conn: Database connection

    :param statements_and_values: The statements and values to be executed
    :type statements_and_values: A list of lists. Each sublist consists of a string, the SQL prepared statement with %s placeholders, and a list or tuple of its parameters

    :param: rollback_on_error: Flag to indicate action to be taken on an exception
    :type rollback_on_error: bool

    :returns cursor from the last statement executed
    :rtype cursor
    """

    try:
        cursor = conn.cursor()
        for s_v in statements_and_values:
            cursor.execute(s_v[0], s_v[1])
            if not rollback_on_error:
                conn.commit() # commit on each statement
    except Exception as e:
        if rollback_on_error:
            conn.rollback()
        raise
    else:
        if rollback_on_error:
            conn.commit() # then commit only after all statements have completed successfully
        return cursor # return the cursor in case there are results to be processed

Ví dụ:

cursor = execute_multiple_prepared(conn, [('select * from test_table where count = %s', (2000,))], False)

Mặc dù, phải thừa nhận, cuộc gọi trên chỉ có một câu lệnh SQL được chuẩn bị với các tham số.

Đã trả lời ngày 3 tháng 7 năm 2020 lúc 12:12Jul 3, 2020 at 12:12

Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

BoobooboobooBooboo

33.3K3 Huy hiệu vàng33 Huy hiệu bạc53 Huy hiệu Đồng3 gold badges33 silver badges53 bronze badges

1

Vẻ đẹp nằm trong mắt của người si tình, vì vậy cách tốt nhất để làm điều gì đó là chủ quan trừ khi bạn cho chúng tôi biết cách đo lường một cách rõ ràng. Có ba lựa chọn giả thuyết mà tôi có thể thấy:

  1. Sử dụng tùy chọn
    args = ['mytable', 'table_name']
    cursor.callproc('CopyTable', args)
    
    2 của mysqlcursor (không lý tưởng)
  2. Giữ truy vấn theo nhiều hàng
  3. Giữ truy vấn trong một hàng

Tùy chọn, bạn cũng có thể thay đổi truy vấn xung quanh để tránh một số công việc không cần thiết.


Về tùy chọn

args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
2 Tài liệu MySQL khá rõ ràng về điều này

Nếu Multi được đặt thành True, EXECUTE () có thể thực thi nhiều câu lệnh được chỉ định trong chuỗi hoạt động. Nó trả về một trình lặp cho phép xử lý kết quả của mỗi câu lệnh. Tuy nhiên, sử dụng các tham số không hoạt động tốt trong trường hợp này và thường là một ý tưởng tốt để tự thực hiện từng câu lệnh.using parameters does not work well in this case, and it is usually a good idea to execute each statement on its own.


Về tùy chọn 2. và 3. Nó hoàn toàn là một ưu tiên về cách bạn muốn xem mã của mình. Hãy nhớ lại rằng một đối tượng kết nối có

args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
4 theo mặc định, vì vậy con trỏ thực sự các đợt
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 ;
0 gọi vào một giao dịch duy nhất. Nói cách khác, cả hai phiên bản dưới đây đều tương đương.

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,))

vs

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

Python 3.6 đã giới thiệu các chuỗi F siêu thanh lịch và bạn nên sử dụng chúng nếu bạn có thể. :)

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,))
0

Lưu ý rằng điều này không còn giữ khi bạn bắt đầu thao tác các hàng; Trong trường hợp này, nó trở thành truy vấn cụ thể và bạn nên hồ sơ nếu có liên quan. Một câu hỏi liên quan là điều gì là nhanh hơn, một truy vấn lớn hoặc nhiều truy vấn nhỏ?


Cuối cùng, có thể sử dụng

args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
6 thanh lịch hơn thay vì
args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
7 trừ khi bạn có lý do cụ thể không.

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,))
1

Đã trả lời ngày 4 tháng 7 năm 2020 lúc 5:32Jul 4, 2020 at 5:32

Tôi bị mắc kẹt nhiều lần trong các loại vấn đề này trong dự án. Sau nhiều nghiên cứu, tôi đã tìm thấy một số điểm và gợi ý.

  1. Phương pháp
    args = ['mytable', 'table_name']
    cursor.callproc('CopyTable', args)
    
    8 hoạt động tốt với một truy vấn tại một thời điểm. Bởi vì trong quá trình thực hiện phương pháp chăm sóc trạng thái.

Tôi biết

args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
9 lấy nhiều truy vấn. Nhưng các tham số không hoạt động tốt trong trường hợp này và đôi khi ngoại lệ lỗi nội bộ cũng làm hỏng tất cả các kết quả. Và mã trở nên lớn và mơ hồ. Ngay cả tài liệu cũng đề cập đến điều này.
Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

  1. operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
    for result in cursor.execute(operation, multi=True):
        ...
    
    0 không phải là một thực hành tốt để thực hiện mọi lúc. Bởi vì hoạt động tạo ra một hoặc nhiều bộ kết quả cấu thành hành vi không xác định và việc thực hiện được cho phép (nhưng không bắt buộc) để nêu ra một ngoại lệ khi phát hiện một tập kết quả đã được tạo ra bởi một lời mời hoạt động. [Nguồn - Docs]

Gợi ý 1-:

Lập danh sách các truy vấn như -:

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,))
2

Gợi ý 2-:

Thiết lập với dict.

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

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,))
3

Bạn cũng có thể sử dụng Split với Script.

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

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,))
4

Lưu ý -: Tôi sử dụng hầu hết cách tiếp cận

operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
for result in cursor.execute(operation, multi=True):
    ...
3 nhưng trong một số nơi phức tạp, hãy sử dụng phương pháp tiếp cận
operation = 'SELECT 1; INSERT INTO t1 VALUES (); SELECT 2'
for result in cursor.execute(operation, multi=True):
    ...
4.

Đã trả lời ngày 30 tháng 6 năm 2020 lúc 21:47Jun 30, 2020 at 21:47

Nhìn vào tài liệu cho mysqlcursor.execute ().

Nó tuyên bố rằng bạn có thể truyền trong tham số

args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
2 cho phép bạn chạy nhiều truy vấn trong một chuỗi.

Nếu Multi được đặt thành True, EXECUTE () có thể thực thi nhiều câu lệnh được chỉ định trong chuỗi hoạt động.

args = ['mytable', 'table_name']
cursor.callproc('CopyTable', args)
2 là một tham số thứ hai tùy chọn cho cuộc gọi thực thi ():


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,))
5

Đã trả lời ngày 1 tháng 7 năm 2020 lúc 0:32Jul 1, 2020 at 0:32

Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

Umutambyi Gadumutambyi GadUmutambyi Gad

4.0403 Huy hiệu vàng16 Huy hiệu bạc36 Huy hiệu đồng3 gold badges16 silver badges36 bronze badges

Với

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

Bạn có thể thực hiện lệnh sau, chỉ cần thay thế T1 và các tập, bằng Tabaes của riêng bạn

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,))
6

Mặc dù điều này sẽ chạy, bạn phải chắc chắn rằng các hạn chế khóa nước ngoài sẽ có hiệu lực sau khi cho phép nó, sẽ không gây ra vấn đề.

Nếu TableName là thứ mà người dùng có thể nhập, bạn nên nghĩ về danh sách trắng của tên bảng.

Statemnts chuẩn bị không hoạt động với tên bảng và cột, vì vậy chúng tôi phải sử dụng thay thế chuỗi để lấy các tên bảng chính xác theo đúng vị trí, bit này sẽ khiến mã của bạn dễ bị tiêm SQL tiêmvulnerable to sql injection

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 ;
3 là cần thiết để chạy 4 lệnh trong đầu nối, khi tôi thử nghiệm nó, trình gỡ lỗi yêu cầu nó.

Đã trả lời ngày 1 tháng 7 năm 2020 lúc 2:10Jul 1, 2020 at 2:10

Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

nbknbknbk

38.9k6 Huy hiệu vàng27 Huy hiệu bạc42 Huy hiệu đồng6 gold badges27 silver badges42 bronze badges

2

  1. Executescript () Đây là một phương thức tiện lợi để thực hiện nhiều câu lệnh SQL cùng một lúc. Nó thực thi tập lệnh SQL mà nó nhận được dưới dạng tham số. Cú pháp:

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

Mã ví dụ:

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,))
7

Output:

[(1,)] [("Cơ quan thám tử GFG của Dan Clarke", 'Sean Simpsons', 1987)]]

  1. EXECUTEMANY () Nó thường như vậy khi, một lượng lớn dữ liệu phải được chèn vào cơ sở dữ liệu từ các tệp dữ liệu (đối với các trường hợp đơn giản hơn, danh sách, mảng). Nó sẽ đơn giản để lặp lại mã nhiều lần so với viết mỗi lần, mỗi dòng vào cơ sở dữ liệu. Nhưng việc sử dụng vòng lặp sẽ không phù hợp trong trường hợp này, ví dụ dưới đây cho thấy lý do tại sao. Cú pháp và việc sử dụng ExecuterMany () được giải thích bên dưới và cách sử dụng nó như một vòng lặp:

Nguồn: GeekSforGeek: SQL Sử dụng Python Kiểm tra nguồn này .. Điều này có rất nhiều thứ tuyệt vời cho bạn.

Đã trả lời ngày 2 tháng 7 năm 2020 lúc 20:00Jul 2, 2020 at 20:00

Hướng dẫn how do i run multiple sql queries in python? - làm cách nào để chạy nhiều truy vấn sql trong python?

Shivam Jhashivam JhaShivam Jha

2.7312 huy hiệu vàng21 Huy hiệu bạc33 Huy hiệu đồng2 gold badges21 silver badges33 bronze badges

Tất cả các câu trả lời là hoàn toàn hợp lệ vì vậy tôi sẽ thêm giải pháp của mình bằng cách nhập tĩnh và trình quản lý bối cảnh

def execute_multiple(conn, statements, rollback_on_error=True):
    """
    Execute multiple SQL statements and returns the cursor from the last executed statement.

    :param conn: The connection to the database
    :type conn: Database connection

    :param statements: The statements to be executed
    :type statements: A list of strings

    :param: rollback_on_error: Flag to indicate action to be taken on an exception
    :type rollback_on_error: bool

    :returns cursor from the last statement executed
    :rtype cursor
    """

    try:
        cursor = conn.cursor()
        for statement in statements:
            cursor.execute(statement)
            if not rollback_on_error:
                conn.commit() # commit on each statement
    except Exception as e:
        if rollback_on_error:
            conn.rollback()
        raise
    else:
        if rollback_on_error:
            conn.commit() # then commit only after all statements have completed successfully
0.

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,))
8

Nếu tôi không nhầm kết nối hoặc con trỏ có thể không phải là người quản lý ngữ cảnh, tùy thuộc vào phiên bản trình điều khiển MySQL mà bạn đang có, vì vậy đó là một giải pháp an toàn pythonic.

Đã trả lời ngày 2 tháng 7 năm 2020 lúc 18:02Jul 2, 2020 at 18:02

Tom Wojciktom WojcikTom Wojcik

4.8384 Huy hiệu vàng29 Huy hiệu bạc43 Huy hiệu đồng4 gold badges29 silver badges43 bronze badges