[英]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_STATEMENTS
為0
(關閉),因此如果要運行匿名代碼塊,則必須在連接字符串中包含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.