为什么我的SQL查询参数未返回正确的值?

时间:2018-07-25 15:28:31

标签: python sql scripting

我正在尝试为大量记录(> 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()

1 个答案:

答案 0 :(得分:0)

我不知道,列名不能作为参数传递。 Panagiotis Kanavos在评论中回答了此问题。我猜我将不得不找出一种不同的方式来生成查询。非常感谢大家,谢谢。