我正在尝试为大量记录(> 4200万条)创建一个SQL查询,以插入到远程数据库中。目前,我正在以INSERT INTO tablename (columnnames) VALUES (values)
格式构建查询
表名,列名和值的长度都不同,因此我生成的占位符数量等于所需值的数量。
结果是我有一个名为sqcommand的字符串,看起来像INSERT INTO ColName (?,?,?) VALUES (?,?,?);
,还有一个参数列表,看起来像([Name1, Name2, Name3, Val1, Val2, Val3])
。
当尝试以db.execute(sqlcommand, params)
执行查询时,出现错误,表明我试图插入列“ @ P1”,“ @ P2”,“ @ P3”等。为什么列表中的值不能正确翻译?它从哪里获取“ @ P1”?我知道我没有该名称的列,据我所知,我没有引用该名称的列,但是execute方法仍在尝试使用它。
更新:根据请求,完整的代码如下,并进行了修改以避免任何可能是私有的内容。最终结果是将数据从sqlite3 db文件逐行移动到AWS SQL Server。
newDB = pyodbc.connect(newDataBase)
oldDB = sqlite3.connect(oldDatabase)
tables = oldDB.execute("SELECT * FROM sqlite_master WHERE type='table';").fetchall()
t0 = datetime.now()
for table in tables:
print('Parsing:', str(table[1]))
t1 = datetime.now()
colInfo = oldDB.execute('PRAGMA table_info('+table[1]+');').fetchall()
cols = list()
cph = ""
i = 0
for col in colInfo:
cph += "?,"
cols.append(str(col[1]))
rowCount = oldDB.execute("SELECT COUNT(*) FROM "+table[1]+" ;").fetchall()
count = 0
while count <= int(rowCount[0][0]):
params = list()
params.append(cols)
count += 1
row = oldDB.execute("SELECT * FROM "+table[1]+" LIMIT 1;").fetchone()
ph = ""
for val in row:
ph += "?,"
params = params.append(str(val))
ph = ph[:-1]
cph = cph[:-1]
print(str(table[1]))
sqlcommand = "INSERT INTO "+str(table[1])+" ("+cph+") VALUES ("+ph+");"
print(sqlcommand)
print(params)
newDB.execute(sqlcommand, params)
sqlcommand = "DELETE FROM ? WHERE ? = ?;"
oldDB.execute(sqlcommand, (str(table[1]), cols[0], vals[0],))
newDB.commit()
答案 0 :(得分:0)
我不知道,列名不能作为参数传递。 Panagiotis Kanavos在评论中回答了此问题。我猜我将不得不找出一种不同的方式来生成查询。非常感谢大家,谢谢。