无法在Python中将多个列表插入单个MySQL查询中

时间:2015-11-24 17:34:26

标签: python mysql

我正在尝试将两个列表插入MySQL表中以构成一行。我可以通过将列表的每个索引引用到MySQL查询中来成功地完成此操作,但我希望能够将列表放入查询中而无需键入每个索引。

以下是我的代码片段(在Python 3.5中):

with self.conn.cursor() as cursor:
   add_accounts_query = "INSERT INTO accounts(column1, column2, column3, column4, column5) \
                         VALUES ('{0}', '{1}', '{2}', '{3}', '{4}', '{5}')"
   try:
       cursor.execute(add_accounts_query.format(a_list[0], a_list[1], a_list[2], b_list[0], b_list[1], b_list[2]))

以下是我尝试过的不起作用:

try:
    cursor.execute(add_accounts_query.format(
        ", ".join(list(map(str, a_list))) + ", " + ", ".join(list(map(str, b_list)))))

我也通过删除逗号,在外部添加撇号等尝试了上述的许多变体,但似乎没有任何效果。我一直得到一个“IndexError:元组索引超出范围”

请注意,列表中的值可以是字符串或整数或无。

2 个答案:

答案 0 :(得分:2)

首先,将列表映射到列是个坏主意。每次你决定 要在列表中添加新元素,您需要添加一个新列。

如果您拥有单个帐户的数据,那么您最好使用a 用于定义帐户数据模型的类,如:

class Account:
    def __init__(self, column1, column2, column3, column4, column5, column6):
        self.column1 = column1
        self.column2 = column2
        self.column3 = column3
        self.column4 = column4
        self.column5 = column5
        self.column6 = column6

然后你可以实例化它:

account = Account('val1', 'val2', 'val3', 'val4', 'val5', 'val6')

您可以格式化查询:

query = add_account_query.format(
    account.column1,
    account.column2,
    account.column3,
    account.column4,
    account.column5
    account.column6)
cursor.execute(query)

如果您希望自动将模型域映射到数据库列, 你可以看看ORM库,比如 peewee。有关Python ORM的列表 检查this link

然后你可以define your account model like

from peewee import *

mysql_db = MySQLDatabase('my_database',
    host='localhost',
    port=3306,
    user='myuser',
    password='mypass')

class Account(Model):
    column1 = CharField()
    column2 = CharField()
    column3 = CharField()
    column4 = CharField()
    column5 = CharField()
    column6 = CharField()

    class Meta:
        database = mysql_db
        db_table = 'accounts'

然后storing the data in您的数据库就像以下一样简单:

account = Account.create(
    column1='val1',
    column2='val2',
    column3='val3',
    column4='val4',
    column5='val5',
    column6='val6')

您很可能还需要数据模型中的ID列。

答案 1 :(得分:1)

您可以使用argument list unpacking将列表转换为单独的函数参数。

cursor.execute(add_accounts_query.format(*a_list, *b_list))