Python Pyodbc&;SQL Server TypeError:在字符串格式化过程中未转换所有参数

Python Pyodbc&;SQL Server TypeError:在字符串格式化过程中未转换所有参数,python,sql,sql-server,tsql,pyodbc,Python,Sql,Sql Server,Tsql,Pyodbc,我试图从一个数据库读取数据,然后在另一台机器上写入另一个数据库。我得到了一个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("

我试图从一个数据库读取数据,然后在另一台机器上写入另一个数据库。我得到了一个
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:format string的参数不够

更新:
,'.join(params)
更改为
元组(params)
(如下所示),我仍然收到一个
类型错误:格式字符串的参数不足

您遇到的问题是,params应该是元组

"""INSERT INTO destination_table (col1, col2, col3, col4, col5, col6, col7) VALUES (%s,%s,%s,%s,%s,%s,%s);""" % tuple(params)
使用join函数将尝试将“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)

整个
…%元组(参数)
不需要部分。我只是用
cur2把参数列表放进去。在得到一些
后执行
…没有足够的参数…
错误

这是固定块:

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

谢谢你的建议。我试过了,但是我仍然得到了
TypeError:没有足够的参数用于格式化字符串
更新的答案。很可能,您的“参数”列表没有为每个“%s”所需的7个元素
read\u list
提供一个参数,
read\u list[i]
打印时提供7个<代码>['%s','%s','%s','%s','%s','%s','%s','%s']
现在
pyodbc.ProgrammingError:('SQL包含0个参数标记,但提供了7个参数,'HY000')
被抛出。尝试将
%s
替换为
(根据pyodbc文档),但这会产生相同的
类型错误…在字符串格式化期间转换并打印7。值得注意的是,SQLite3的行为略有不同;如果“In”数据库是Sqlite,则
rows=cur1.fetchall()
返回
sqlite3.Row
对象的列表。您必须这样访问它们:
cur2.execute(sql,list(read_list[i]))