Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python SQLite Where子句语法错误_Python_Sqlite_Csv - Fatal编程技术网

Python SQLite Where子句语法错误

Python SQLite Where子句语法错误,python,sqlite,csv,Python,Sqlite,Csv,我正在使用Python创建一个SQLite数据库,其中包含来自多个CSV文件的数据。从文件A中,我成功地创建了一个表并向该表添加了条目。我想从文件B向数据库添加其他列。文件A和文件B中的行不匹配,但它们需要在数据库中匹配 对于代码的长度,我深表歉意-我正在从CSV文件中选择要添加到数据库的特定行。我在这里包括了所有代码,以防上下文有所帮助 此代码适用于: with open('/Users/Leo/Desktop/accord_key.csv','rU') as accord_csv:

我正在使用Python创建一个SQLite数据库,其中包含来自多个CSV文件的数据。从文件A中,我成功地创建了一个表并向该表添加了条目。我想从文件B向数据库添加其他列。文件A和文件B中的行不匹配,但它们需要在数据库中匹配

对于代码的长度,我深表歉意-我正在从CSV文件中选择要添加到数据库的特定行。我在这里包括了所有代码,以防上下文有所帮助

此代码适用于:

with open('/Users/Leo/Desktop/accord_key.csv','rU') as accord_csv:
     accord_csv_reader = csv.reader(accord_csv)
    for row in accord_csv_reader:
        MaskID = row[0]
        female = row[1]
        age = row[2]
        arm = row[3]
        cvd_hx_baseline = row[6]
        female = int(female)
        age = float(age)
        arm = int(arm)
        cvd_hx_baseline = int(cvd_hx_baseline)

        if age < 50: continue
        if ((arm == 5) or (arm == 6) or (arm == 7) or (arm == 8)): continue
        female = str(female)
        age = str(age)
        arm = str(arm)
        cvd_hx_baseline = str(cvd_hx_baseline)
        cur.execute('INSERT OR IGNORE INTO accord_baseline (MaskID) VALUES (?)',
                (MaskID,)
                )
        cur.execute('UPDATE OR IGNORE accord_baseline SET female = '+female+' WHERE MaskID=?',
                (MaskID,)
                )
        cur.execute('UPDATE OR IGNORE accord_baseline SET age = '+age+' WHERE MaskID=?',
                (MaskID,)
                )
        cur.execute('UPDATE OR IGNORE accord_baseline SET arm = '+arm+' WHERE MaskID=?',
                (MaskID,)
                )
        cur.execute('UPDATE OR IGNORE accord_baseline SET cvd_hx_baseline = '+cvd_hx_baseline+' WHERE MaskID=?',
                (MaskID,)
                )
        age = float(age)
        if age >= 75:
            cur.execute('UPDATE OR IGNORE accord_baseline SET age_75 = 1 WHERE MaskID=?',
                    (MaskID,)
                    )
    conn.commit()
    accord_csv.close()

由于我无法通过搜索找到答案,我感谢您提供的任何帮助

在您的情况下,这可能是问题所在,也可能不是问题所在-您只正确执行了一半的转义,因此,如果数据中存在
,则SQL查询可能会损坏

不要这样做:

cur.execute('UPDATE OR IGNORE accord_baseline SET mdrd = '+gfr+' WHERE MaskID=?',
    (MaskID,))
改为这样做:

cur.execute('UPDATE OR IGNORE accord_baseline SET mdrd = ? WHERE MaskID=?',
    (gfr, MaskID))

“此代码不起作用”-但它究竟是如何不起作用的?:)它是否引发了一个例外?或者一切看起来都正常(没有例外),但数据不在数据库中?我只需将所有数据导入两个临时表中,然后使用一些SQL查询进行合并。此外,为了避免SQL注入攻击,这种技术是一种很好的做法。您好,Messa,谢谢您的帮助。将“+var+”替换为?解决了我的问题。你能解释一下为什么在这个例子中连接不起作用吗?我以前使用过类似的代码来完成类似的任务。@L.Buckley想象一下当
gfr
例如
“foo'bar”
-SQL(在第一种情况下)变成
“更新或忽略accord\u基线集mdrd='foo'bar',其中MaskID=?”
-
mdrd
字符串将只是
'foo'
,其余的将成为无效的SQL表达式。还有更糟糕的情况,有人可能滥用这种行为并执行一种称为SQL注入的攻击。
cur.execute('UPDATE OR IGNORE accord_baseline SET mdrd = ? WHERE MaskID=?',
    (gfr, MaskID))