簡體   English   中英

python cursor.execute 可以在一個 go 中接受多個查詢嗎?

[英]Can python cursor.execute accept multiple queries in one go?

下面的 cursor.execute 調用能否在一個 go 中執行多個 SQL 查詢?

cursor.execute("use testdb;CREATE USER MyLogin")

我還沒有 python 設置,但想知道 cursor.execute 是否支持上述表格?

import pyodbc 
# Some other example server values are
# server = 'localhost\sqlexpress' # for a named instance
# server = 'myserver,port' # to specify an alternate port
server = 'tcp:myserver.database.windows.net' 
database = 'mydb' 
username = 'myusername' 
password = 'mypassword' 
cnxn = pyodbc.connect('DRIVER={ODBC Driver 17 for SQL Server};SERVER='+server+';DATABASE='+database+';UID='+username+';PWD='+ password)
cursor = cnxn.cursor()
#Sample select query
cursor.execute("SELECT @@version;") 
row = cursor.fetchone() 
while row: 
    print(row[0])
    row = cursor.fetchone()

對的,這是可能的。

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

但這不是一個全面的解決方案。 例如,在具有兩個選擇的查詢中,您會遇到問題。

考慮必須在游標中獲取兩種類型的答案!

因此,最好的解決方案是將查詢分解為子查詢並逐步完成您的工作。 例如:

s = "USE some_db; SELECT * FROM some_table;"
s = filter(None, s.split(';'))

for i in s:
    cur.execute(i.strip() + ';')

在 pyodbc 文檔中應該給你你正在尋找的例子。 更多在 GitHub wiki: https://github.com/mkleehammer/pyodbc/wiki/Objects#cursors

你可以在這里看到一個例子:

cnxn   = pyodbc.connect(...)
cursor = cnxn.cursor()

cursor.execute("""
               select user_id, last_logon
                 from users
                where last_logon > ?
                  and user_type <> 'admin'
               """, twoweeks)

rows = cursor.fetchall()

for row in rows:
    print('user %s logged on at %s' % (row.user_id, row.last_logon))

從這個例子和探索代碼,我想說你的下一步是測試一個多 cursor.execute("<your_sql_Querie>")。

如果此測試有效,則可以嘗試創建一個 CLASS 然后為您要運行的每個查詢創建該 class 的實例。

這將是開發人員復制文檔工作的基本演變......希望這對您有所幫助:)

單個字符串中的多個 SQL 語句通常稱為“匿名代碼塊”。

pyodbc(或 pypyodbc)中沒有任何內容可以阻止您將包含匿名代碼塊的字符串傳遞給Cursor.execute()方法。 他們只需將字符串傳遞給 ODBC 驅動程序管理器 (DM),然后再將其傳遞給 ODBC 驅動程序。

但是,並非所有 ODBC 驅動程序默認都接受匿名代碼塊。 一些數據庫默認只允許一個 SQL 語句每個.execute()以保護我們免受 SQL 注入問題。

例如,MySQL/Connector ODBC 默認MULTI_STATEMENTS0 (關閉),因此如果要運行匿名代碼塊,則必須在連接字符串中包含MULTI_STATEMENTS=1

另請注意,通過在匿名代碼塊中包含USE …語句來更改當前數據庫有時會導致問題,因為數據庫上下文在事務中間發生更改。 通常最好單獨執行一個USE …語句,然后繼續執行其他 SQL 語句。

是的,您可以使用 nextset() 方法獲得多個查詢的結果...

query = "select * from Table1; select * from Table2"
cursor = connection.cursor()
cursor.execute(query)

table1 = cursor.fetchall()

cursor.nextset()

table2 = cursor.fetchall()

代碼對此進行了解釋...游標返回結果“集合”,您可以使用 nextset() 方法在它們之間移動。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM