Pyodbc& SQL Server-TypeError:并非在字符串格式化期间转换所有参数

时间:2015-06-22 16:18:15

标签: python sql sql-server tsql pyodbc

我试图从一个数据库中读取数据,然后在另一台机器上写入另一个数据库。我得到了TypeError: not all arguments converted during string formatting

这是我的代码:

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

2 个答案:

答案 0 :(得分:1)

你遇到的问题是params应该是一个元组。

localhost

使用join函数将尝试转换" params"到一个变量,这是一个字符串。所以它会尝试把它全部推到你的第一个"%s"。

验证您的输入" params"有足够的元素,尝试打印出来(或使用调试器)。要打印:

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

答案 1 :(得分:1)

不需要整个... % tuple(params)部分。在收到一些cur2.excecute错误后,我只是将参数列表放在...not enough parameters...

这是固定的块:

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