我试图从一个数据库中读取数据,然后在另一台机器上写入另一个数据库。我得到了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
答案 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