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]))