2017-05-31 38 views
0

我有一個psycopg連接:如何使用pyodbc將psycopg2的結果集插入到SQL表中?

conngre = psycopg2.connect("host='blah' port='blah' dbname='blah' user='blah' password='blah'") 
conngre = conngre.cursor() 

with open('exportgre', 'r') as selectexport: 
    var1 = selectexport.read() 
    conngre.execute(var1) 

這就要求,我想,然後轉儲到SQL Server的預定義的表連接一個結果:

sqlconn = pyodbc.connect(r'DSN=d;UID=blah;PWD=blah') 
cursql = sqlconn.cursor() 

with open('importsql', 'r') as selectexport: 
    var2 = selectexport.read() 
    cursql.execute(var2) 

是thier的方式來傳遞從結果第一個結果集插入第二個結果集的插入?

我現在已經跑了下面的代碼作爲測試,以得到這個用我的實際的SQL前工作:

import pyodbc 

sqlconn = pyodbc.connect(r'DSN=d;UID=blah;PWD=blah') 
cursql = sqlconn.cursor() 

with cursql.execute("select * from blah.dbo.export_test"): 

rows = cursql.fetchall() 

for row in rows: 
    cursql.execute('insert into TouchStar.dbo.export_test values (?)', (row[0])) 
    print(row) 

但是它似乎只是簡單地覆蓋我的數據是已經在表中?

我需要追加嗎?

+0

您可以包含您在'exportgre'和'importsql'文件中運行的SQL查詢的示例嗎?我不確定你說的兩個文件是如何解決問題的。如果我試圖從PostreSQL讀取數據並寫入SQL Server,我只需從PostgreSQL中選擇行,循環它們,然後在不使用任何文件的情況下將所需內容插入到SQL Server中。 PostgreSQL'fetchmany'方法可以用來一次獲取一定數量的行,並使用SQL Server'executemany'生成一個單獨的插入。 – FlipperPA

+0

我真的不能包括確切的列作爲公司敏感,但表格是喜歡喜歡的,但將有一個日期提取列在sql表的開始。 –

回答

1

你會想在中間使用Python字典。首先,使用RealDictCursor從PostgreSQL的選擇:

conngre = psycopg2.connect("host='blah' port='blah' dbname='blah' user='blah' password='blah'", cursor_factory=psycopg2.extras.RealDictCursor) 
curgre = conngre.cursor() 

sqlconn = pyodbc.connect(r'DSN=d;UID=blah;PWD=blah') 
cursql = sqlconn.cursor() 

with open('exportgre', 'r') as selectexport: 
    var1 = selectexport.read() 
    curgre.execute(var1) 
    rows = curgre.fetchall() 
    for row in rows: 
     cursql.execute('INSERT INTO table_name (col1, col2, col3) VALUES (?, ?, ?)', (row[0], row[1], row[2])) 

對於「selectexport」每個SELECT語句,這樣會運行查詢,並遍歷所有的行。對於每一行,它都會插入到pyodbc遊標中。你將不得不修改插入語句以適應。祝你好運!

+0

嗨FlipperPA抱歉,我將在今天下午上班。這是否會爲每行創建一個SQL事務?或者它會整理完整的字典,然後立即執行所有字典,我的數據集大約有12,000行,因此無法依次支付12,000個查詢。 –

+0

這會做12000個插入查詢。你可以使用'executemany'來代替pyodbc或'execute'。 – FlipperPA

+0

嗨FlipperPA我編輯了我的問題,我試圖測試pyodbc到pyodbc作爲我的postgre連接當前不可用的代碼。 –

相關問題