【问题标题】:Insert list of dictionaries and variable into table将字典和变量列表插入表中
【发布时间】:2018-10-27 06:11:06
【问题描述】:
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 项。这要求每个插入的列有一个值。您可以简单地更新列表或实现自己的格式化功能来处理您的需求,类似于github.com/PyMySQL/PyMySQL/blob/master/pymysql/cursors.py#L189

标签: python mysql python-2.7 pymysql


【解决方案1】:

您的问题是,它试图将所有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% 了解语法,但我希望你能明白。如果我有拼写错误,请评论/编辑答案。

【讨论】:

    猜你喜欢
    • 2022-10-18
    • 2019-03-21
    • 2016-08-05
    • 2021-06-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-10
    • 2016-02-11
    相关资源
    最近更新 更多