Параметизировать столбцы данных - PullRequest
0 голосов
/ 11 марта 2020

Я хотел бы параметризовать столбцы и мой фрейм данных в функции cursor.execute. Я использую pyms sql, потому что мне нравится тот факт, что я могу назвать параметризованные столбцы. Тем не менее, я до сих пор не знаю, как правильно сказать python, что я имею в виду указанный c фрейм данных, и я хотел бы использовать эти столбцы. Вот последняя часть моего кода (я уже проверил соединение с моей базой данных и т. Д. c. И это работает):

with conn:
    cursor = conn.cursor()
    cursor.execute("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s)""", dataframe)
    result = cursor.fetchall()

    for row in result:
        print(list(row))

Я получаю эту ошибку:

ValueError                                Traceback (most recent call last)
<ipython-input-52-037e289ce76e> in <module>
     10 with conn:
     11     cursor = conn.cursor()
---> 12     cursor.execute("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s""", dataframe)
     13     result= cursor.fetchall()
     14 

src\pymssql.pyx in pymssql.Cursor.execute()

~\AppData\Local\Continuum\anaconda3\lib\site-packages\pandas\core\generic.py in __nonzero__(self)
   1477     def __nonzero__(self):
   1478         raise ValueError(
-> 1479             f"The truth value of a {type(self).__name__} is ambiguous. "
   1480             "Use a.empty, a.bool(), a.item(), a.any() or a.all()."
   1481         )

ValueError: The truth value of a DataFrame is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

Ответы [ 2 ]

0 голосов
/ 12 марта 2020

Я понял, в чем была моя проблема. Из-за того, что я преобразовал свой фрейм данных в словарь (использовал dataframe.to_dict'index '), словарь был вложенным. Я сослался на dataframe[0], и это сработало. На всякий случай, если у кого-то возникла такая же проблема.

0 голосов
/ 11 марта 2020

Трудно догадаться, почему вы хотите использовать fetchall после запроса вставки: fetchall обычно используется для запросов выбора.

execute обычно вставляет одну единственную строку в таблицу. PEP-249 рекомендует использовать executemany, если вы хотите вставить много строк одновременно. Но проблема в том, что параметр должен быть итерируемым из записей : итерируемым из итерируемых, если вы используете позиционные параметры (? или :1, ...), или итерируемым из отображений если вы используете именованные параметры. И датафрейм не тот. Но вы можете преобразовать его в список диктов с помощью .to_dict(orient='record). Так что это должно работать (это работает на моих тестах с использованием SQLite3):

cursor.executemany("""insert into [dbo].[testdb] (day, revenue) values (%(day)s, %(revenue)s)""",
                dataframe.to_dict(orient='record'))
...