1

我有问题 OperationalError: (1054, "Unknown column 'Ellie' in 'field list'") 使用下面的代码,我正在尝试将数据从 json 插入到我的 sql 数据库中。每当我尝试在这种情况下插入字符串“Ellie”时都会出现问题,我认为这与字符串插值有关,但尽管尝试了我在这里看到的其他一些解决方案,但我无法让它工作。

创建表

con = MySQLdb.connect('localhost','root','','tweetsdb01')
cursor = con.cursor()
cursor.execute("CREATE TABLE IF NOT EXISTS User(user_id BIGINT NOT NULL PRIMARY KEY, username varchar(25) NOT NULL,user varchar(25) NOT NULL) CHARACTER SET utf8 COLLATE utf8_unicode_ci ENGINE=InnoDB")
con.commit() 

插入

def populate_user(a,b,c):
    con = MySQLdb.connect('localhost','root','','tweetsdb01')
    cursor = con.cursor()
    cursor.execute("INSERT INTO User(user_id,username,user) VALUES(%s,%s,%s)"%(a,b,c))
    con.commit() 
    cursor.close() 

READ FILE - 这会调用上面的填充方法

def read(file):
    json_data=open(file)
    tweets = []
    for i in range(10):
        tweet = json.loads(json_data.readline())

    populate_user(tweet['from_user_id'],tweet['from_user_name'],tweet['from_user'])
4

2 回答 2

4

使用参数化 SQL

cursor.execute("INSERT INTO User(user_id,username,user) VALUES (%s,%s,%s)", (a,b,c))

(请注意,这些值作为第二个参数(a,b,c)传递给函数execute,而不是通过字符串插值作为第一个参数的一部分)。MySQLdb 将为您正确引用参数。


PS。正如 Vajk Hermecz 指出的那样,出现问题是因为'Ellie'没有正确引用字符串。

"(%s,)" % (a,)当你用你 做字符串插值时,(Ellie,)你真正想要的是('Ellie',). 但是不要费心自己引用。使用参数化 SQL 更安全、更容易。

于 2012-11-14T09:30:42.743 回答
2

您的问题是您正在将值添加到查询中而没有任何转义......现在它被打破了。您可以执行以下操作:

cursor.execute("INSERT INTO User(user_id,username,user) VALUES(\"%s\",\"%s\",\"%s\")"%(a,b,c))

但这只会将 SQL INJECTION 引入您的代码中。

切勿使用连接查询和数据构造 SQL 语句。您的参数化查询...

这里的正确解决方案是:

cursor.execute("INSERT INTO User(user_id,username,user) VALUES(%s,%s,%s)", (a,b,c))

因此,您的代码的问题在于您使用了%执行字符串格式化的运算符,最后您只给了一个参数cursor.execute。现在正确的解决方案是,不是自己进行字符串格式化,而是在第一个参数中提供查询部分cursor.execute,并在第二个参数中为元组提供参数。

于 2012-11-14T09:29:23.743 回答