如何使用python中的列表对数据库进行动态更新

时间:2016-07-15 18:28:11

标签: python sql-server

if year in Year:
  #print 'executing'
  for rows in range(1,sheet.nrows):
      records = []
      FIP = str(sheet.cell(rows, 1).value)
      for cols in range(9,sheet.ncols):
          records.append(str(sheet.cell(rows,cols).value))
      cur.execute("UPDATE " + str(table_name) + " SET " + (str(variables[0]) + "= \'{0}\', ".format(records[0])
                  + str(variables[1]) + " = \'{0}\', ".format(records[1])
                  + str(variables[2]) + " = \'{0}\', ".format(records[2])
                  + str(variables[3]) + " = \'{0}\', ".format(records[3])
                  + str(variables[4]) + " = \'{0}\',".format(records[4])
                  + str(variables[5]) + " = \'{0}\', ".format(records[5])
                  + str(variables[6]) + " = \'{0}\' ".format(records[6])+
                                        "WHERE DATA_Year='2010'AND FIPS='{0}'".format(FIP)))

以上代码正在更新7个列,其名称存储在列表'变量'中。 我想让它变得动态,以便如果列表中的元素(列)数量变化'增加了,它应该更新所有列而不仅仅是7 我尝试使用此代码执行此操作:

if year in Year:
  #print 'executing'
  for rows in range(1,sheet.nrows):
      records = []
      FIP = str(sheet.cell(rows, 1).value)
      for cols in range(9,sheet.ncols):
          records.append(str(sheet.cell(rows,cols).value))
      for x in range(0,len(variables)):
          #print x
          cur.execute("UPDATE " + str(table_name) + " SET " + (str(variables[x])) + "= \'{0}\', ".format(records[x])
                                        + "WHERE DATA_Year='2010' AND FIPS='{0}'".format(FIP))

但是我收到了错误:
pypyodbc.ProgrammingError: (u'42000', u"[42000] [Microsoft][ODBC SQL Server Driver][SQL Server]Incorrect syntax near the keyword 'WHERE'.")

如果有人可以帮助我弄清楚我的代码有什么问题,以及是否有其他办法可以做我想做的事情,那将会很棒。

1 个答案:

答案 0 :(得分:0)

您会发现使用参数替换更容易。请参阅params,并注意执行采用序列参数。那条线开始看起来像,

cur.execute(sql, records)

如果内存允许(可能确实如此),您可能会发现 executemany 表现更好:您使用一系列记录调用它一次。

考虑到这一点,您问题的动态部分成为焦点。在迭代cols时构造参数化查询字符串。完成后,您应该在records中有一个匹配的(有效的)参数占位符和元素集。然后添加WHERE子句,将FIP附加到记录,然后执行。

HTH。