将字典列表和变量插入表格

5
lst = [{'Fruit':'Apple','HadToday':2},{'Fruit':'Banana','HadToday':8}]

我有一个以上述格式为主的长字典列表。
我有两个固定变量。

person = 'Sam'
date = datetime.datetime.now()

我希望将这些信息插入到一个mysql表中。

目前我如何操作:

for item in lst:
    item['Person'] = person
    item['Date'] = date

cursor.executemany("""
    INSERT INTO myTable (Person,Date,Fruit,HadToday)
    VALUES (%(Person)s, %(Date)s, %(Fruit)s, %(HadToday)s)""", lst)

conn.commit()

有没有一种方法可以绕过循环,因为人员和日期变量是恒定的。 我已经尝试过了。

lst = [{'Fruit':'Apple','HadToday':2},{'Fruit':'Banana','HadToday':8}]
cursor.executemany("""
    INSERT INTO myTable (Person,Date,Fruit,HadToday)
    VALUES (%s, %s, %(Fruit)s, %(HadToday)s)""", (person,date,lst))

conn.commit()
TypeError: 格式化字符串的参数不足

当检测到INSERT语句时,executemany会创建一个多行INSERT语句,并将每个子列表映射到一个VALUE项。这需要每个插入列一个值。您可以简单地更新列表或实现自己的格式化函数来处理您的需求,类似于https://github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L189 - jspcal
1个回答

0

你的问题在于,它试图将所有的lst应用到%(Fruit)s中,而没有留下任何东西给%(HadToday)s)

你不应该通过将固定值硬编码到语句中来解决这个问题,因为如果你有一个像"Tim O'Molligan"这样的名字,你会遇到麻烦——最好让数据库处理正确的格式化。

不是mysql,但你可以理解:http://initd.org/psycopg/docs/usage.html#the-problem-with-the-query-parameters - 我自己也是在一周前学到的 ;o)

可能最干净的方法是使用

cursor.execute("SET @myname = %s", (person,))
cursor.execute("SET @mydate = %s", (datetime.datetime.now(),)) 

并使用

cursor.executemany("""
    INSERT INTO myTable (Person,Date,Fruit,HadToday)
    VALUES (@myname, @mydate, %(Fruit)s, %(HadToday)s)""", lst)

我对语法不是100%确定,但希望你能理解我的意思。如果我有拼写错误,请评论/编辑答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接