我正在尝试将两个列表插入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:元组索引超出范围”
请注意,列表中的值可以是字符串或整数或无。
答案 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))