2017-05-14 42 views
0

我需要連續數百次調用存儲函數, 在單次往返數據庫中做這件事情會有巨大的進步, 這裏是我想要的在僞代碼中執行:SQLAlchemy如何批量調用存儲的func

args_for_multiple_calls = [ 
    {"a1": 1, "a2": "dfg4"), 
    {"a1": 4, "a2": "ger"), 
    {"a1": 2, "a2": "sfg3"), 
] 

connection.executemany("select my_stored_func(:a1, :a2)") 

SQLAlchemy是否支持這個?

回答

0

SQLAlchemy沒有這樣的功能。這些「低級別」命令,如:insert,insertmany,callproc,execute,cursor等..「是由DBAPIPython DB API Specification)驅動程序提供的,如cx-Oracle,psycopg2,MySQL-Python等...... SQLAlchemy只是代理這樣funcionalities提供的DBAPI司機

如果您需要執行一個功能,你應該使用callproc光標方法:

args_for_multiple_calls = [ 
    {"a1": 1, "a2": "dfg4"), 
    {"a1": 4, "a2": "ger"), 
    {"a1": 2, "a2": "sfg3"), 
] 

conn = engine.raw_connection() 
try: 
    cursor = conn.cursor() 
    for x in args_for_multiple_calls: 
     cursor.callproc("my_stored_func", [x['a1'], x['a2']]) 
     results = list(cursor.fetchall()) 
     conn.commit() 
    cursor.close() 
finally: 
    conn.close() 
+0

謝謝,但是如果我有1000行args_for_multiple_calls,我最終會調用分貝1000次?我想在單個數據庫往返中做到這一點 –

1

的SQLAlchemy提供executemany()execute()部分:

session.execute("select my_stored_func(:a1, :a2)", args_for_multiple_calls) 

是否executemany()實際支持SELECT查詢依賴於您的驅動程序。同時請記住,雖然這可能會減少往返開銷,但由於查詢執行開銷可能仍然很慢(即,如果您的所有存儲過程都是INSERT,並且您運行1000次sproc,它將比單行INSERT 1000行)。