Индекс строки вне диапазона при вставке SQL (python) - PullRequest
0 голосов
/ 27 октября 2019

В настоящее время я пишу скрипт на python для вставки информации в MS SQL Server. И я получаю эту ошибку:

   Traceback (most recent call last):
  File "C:\....", line 31, in <module>
    sql_command = format_str.format(ID=i[0],Start_time=i[1],Completion_time=i[2],Email=i[3],Name=i[4],Team=i[5],Jurisdiction=i[6],Caught_up=i[7],
IndexError: string index out of range

Мне кажется, что я неправильно понимаю что-то фундаментальное.

Ниже приведен мой код (я заблокировал несколько вещей и добавил несколько эллипсов с момента его работыи содержит личную информацию):

for i in df:
    format_str = """INSERT INTO DB (ID,Start_time,Completion_time,...)                
                     VALUES ({ID},'{Start_time}','{Completion_time}'...)
                ;"""
    sql_command=format_str.format(ID=i[0],Start_time=i[1],
                                  Completion_time=i[2],...)
    cursor.execute(sql_command)
conn.commit()
cursor.close()
conn.close()

Мне интересно, может ли это быть как-то связано с некоторыми из моих значений, скажем, электронная почта в строке 3 пуста?

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Надеюсь, проблема в том, как вы получаете доступ к фрейму данных Pandas. Например,Давайте рассмотрим примерный кадр данных,

temp = {'string' : ['text1', 'text10', 'text123'], 'string1': ['text1', 'text2', 'text3']}

, когда вы выполняете итерацию, как в вашем коде,

for i in temp:
  print (i)

Здесь 'i' будет иметь значение имен столбцов врамка панд, а не фактические значения строки. И так, если имя столбца - «строка», i [0] - «s», i [1] - «t» и так далее. И именно поэтому вы получаете string index out of range error.

Для итерации строк и получения значений вместо столбцов измените код на

for index, i in df.iterrows():
  format_str = """INSERT INTO DB (ID,Start_time,Completion_time,...)

                 VALUES ({ID},'{Start_time}','{Completion_time}'...)
            ;"""
  sql_command=format_str.format(ID=i[0],Start_time=i[1],
                              Completion_time=i[2],...)
  cursor.execute(sql_command)
conn.commit()
cursor.close()
conn.close()
0 голосов
/ 27 октября 2019

Можете ли вы вывести значение i в цикле for и посмотреть, является ли он массивом, как вы ожидаете?

Я подозреваю, что это строка, а вы индексируете ее для значения, котороене там.

Проверьте этот пример:

In [1]: data = 'string'

In [2]: data[5]
Out[2]: 'g'

In [3]: data[6]  # this is out of bounds!
---------------------------------------------------------------------------
IndexError                                Traceback (most recent call last)
<ipython-input-8-bd176b01b336> in <module>()
----> 1 data[6]

IndexError: string index out of range

Также, если вы хотите перебрать кадр данных pandas, попробуйте это:

for index, row in df.iterrows():
    # save index as your ID if that fits your requirement.
    print(row['column_1'], row['column_2'])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...