2015-06-22 25 views
1

我試圖從一個數據庫中讀取數據,然後在另一臺機器上寫入另一個數據。我得到一個TypeError: not all arguments converted during string formattingPyodbc&SQL Server-TypeError:並非在字符串格式化過程中轉換的所有參數

這裏是我的代碼:

import pyodbc 
#read from db 
read_db = pyodbc.connect(driver='{SQL Server}', host='hostname', databse='DBa', user='user', password='pwd') 
cur = read_db.cursor() 
cur.execute("SELECT * FROM origin_table") 

#write to db 
write_db = pyodbc.connect(driver='{SQL Server}', host='hostname', databse='DBb', user='user', password='pwd') 

#get rows from read 
rows = cur.fetchall() 

#make list, init 
read_list = [] 
i=0 

#add row, write 
for row in rows: 
    read_list.append(row) 
    params = ['%s' for item in read_list] 
    sql = "INSERT INTO destination_table (col1, col2, col3, col4, col5, col6, col7) VALUES (%%s,%%s,%%s,%%s,%%s,%%s,%%s);" % ','.join(params) 
    cur2 = write_db.cursor() 
    cur2.execute(sql, params) 

這裏是從讀輸出的樣子:

('Fname', 'Lname', u'THIS', 'THAT', Decimal('0'), datetime.datetime(2015, 6, 20, 3, 26, 47), u'THE OTHER') 

我已經嘗試了很多不同的解決方案,我已經發現並得到只有TypeError:是我看起來最接近。 我是否需要做某種明確的類型轉換/規範?

當我三聯引用SQL並取出逃生%,像這樣:

"""INSERT INTO destination_table (col1, col2, col3, col4, col5, col6, col7) VALUES (%s,%s,%s,%s,%s,%s,%s);""" % ','.join(params) 

我得到的錯誤是TypeError: not enough arguments for format string

更新時間: 改變了','.join(params)tuple(params)(如建議下面),我仍然得到一個TypeError: not enough arguments for format string

回答

0

整個... % tuple(params)部分是不需要的。在得到一些...not enough parameters...錯誤之後,我只是將參數列表與cur2.excecute放在一起。

這是固定塊:

for row in rows: 
    read_list.append(row) 
    sql = "INSERT INTO destination_table (col1, col2, col3, col4, col5, col6, col7) VALUES (?,?,?,?,?,?,?);" 
    cur2 = write_db.cursor() 
    cur2.execute(sql, read_list[i]) 

而且在控制檯臨時日誌使用整個事情:

import time 
import pyodbc 

read_list = [] 
i=0 

read_db = pyodbc.connect(driver='{SQL Server}', host='read_host', databse='read_db', user='read_user', password='read_pw') 
cur = read_db.cursor() 
cur.execute("SELECT * FROM read_table") 
rows = cur.fetchall() 

write_db = pyodbc.connect(driver='{SQL Server}', host='write_host', databse='write_db', user='write_user', password='write_pw') 

while True: 
    start_time = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) 
    print(10*"/-/") 
    print("Start " + str(start_time)) 
    for row in rows: 
     read_list.append(row) 
     sql = """INSERT INTO write_table (col1, col2, col3, col4, col5, col6, col7) VALUES (?,?,?,?,?,?,?);""" 
     cur2 = write_db.cursor() 
     cur2.execute(sql, read_list[i]) 
     cur2.commit() 
     i+=1 
    print("End, wait 30 minutes") 
    time.sleep(1800) 
    i=0 
+0

對於SQLite3的行爲是值得的不同;如果「In」數據庫是Sqlite,那麼'rows = cur1.fetchall()'返回一個'sqlite3.Row'對象列表。你必須這樣訪問它們: 'cur2.execute(sql,list(read_list [i]))'' –

1

該專業你所擁有的瑕疵是params應該是一個元組。

"""INSERT INTO destination_table (col1, col2, col3, col4, col5, col6, col7) VALUES (%s,%s,%s,%s,%s,%s,%s);""" % tuple(params) 

使用連接函數會嘗試將「params」轉換爲一個字符串變量。所以它會嘗試把它推到你的第一個「%s」。

要驗證輸入「params」是否有足夠的元素,請嘗試將其打印出來(或使用調試器)。打印:

for row in rows: 
    read_list.append(row) 
    params = ['%s' for item in read_list] 
    print(params) 
    query = """INSERT INTO destination_table (col1, col2, col3, col4, col5, col6, col7) VALUES (%s,%s,%s,%s,%s,%s,%s);""" % tuple(params) 
    print(query) 
+0

感謝您的建議。我試過,但我仍然得到'TypeError:沒有足夠的參數格式字符串' –

+1

已更新的答案。最有可能的是,你的「params」列表中沒有每個「%s」所需的7個元素。 – beiller

+0

'read_list'給出了一個參數,'read_list [i]'給出了7。 '['%s','%s','%s','%s','%s','%s','%s']'現在'pyodbc.ProgrammingError :('SQL包含0參數標記,但提供了7個參數','HY000')'被拋出。嘗試用'?'(按照pyodbc文檔)替換'%s',但是它給出了與在字符串格式化期間轉換的'TypeError ...'並打印7. –

相關問題