не все аргументы преобразованы во время форматирования строки — чтение csv, итерация кортежей, запись в базу данных

#python #tuples #pymysql

#python #кортежи #pymysql

Вопрос:

Я все еще новичок, и я застрял на этой проблеме на некоторое время. Я пытаюсь воссоздать это https://datatofish.com/import-csv-sql-server-python / но с большим количеством столбцов и еще большим количеством строк.

Набор данных из https://www.kaggle.com/anikannal/solar-power-generation-data —> Plant_1_Generation_Data.csv

В чем идея этой программы? — Для чтения случайного набора данных в формате CSV и вставки этих данных в мою базу данных SQL.

Подключение к базе данных в порядке. Таблица была успешно создана и видна в базе данных.

Код приведен ниже. Обратите внимание, что я прокомментировал запрос «создать таблицу», поскольку таблица уже создана.

 import pandas as pd
import pymysql

'''defining attributes and csv reading'''

data = pd.read_csv(r'E:Programiranjecsv_practicePlants dataPlant_1_Generation_Data.csv')
df = pd.DataFrame(data, columns=['DATE_TIME', 'PLANT_ID', 'SOURCE_KEY', 'DC_POWER', 'AC_POWER', 
'DAILY_YIELD','TOTAL_YIELD'])

'''database connection and table creation'''

 cnx = pymysql.connect(host='localhost', user='ivan', password='XXX', db='plants_data')
 cursor = cnx.cursor()
 '''cursor.execute('CREATE TABLE plant_data(DATE_TIME datetime, PLANT_ID int, SOURCE_KEY 
 varchar(255), DC_POWER real,AC_POWER real, DAILY_YIELD real, TOTAL_YIELD real)')'''

 '''touple iteration and writing into the table'''

for row in df.itertuples():
cursor.execute('''INSERT INTO plants_data.dbo.plant_data(DATE_TIME,PLANT_ID,SOURCE_KEY,DC_POWER,AC_POWER,DAILY_YIELD,TOTAL_YIELD)
    VALUES(?, ?, ?, ?, ?, ?, ?)
    ''',
    (row.DATE_TIME,
     row.PLANT_ID,
     row.SOURCE_KEY,
     row.DC_POWER,
     row.AC_POWER,
     row.DAILY_YIELD,
     row.TOTAL_YIELD,)
)
cnx.commit()
  

и ошибка

     E:Programiranjecsv_practiceScriptspython.exe E:/Programiranje/Python/csv_practice/main.py
    Traceback (most recent call last):
    File "E:/Programiranje/Python/csv_practice/main.py", line 14, in <module>
    cursor.execute(
    File "E:Programiranjecsv_practicelibsite-packagespymysqlcursors.py", line 161, in execute
    query = self.mogrify(query, args)
    File "E:Programiranjecsv_practicelibsite-packagespymysqlcursors.py", line 140, in mogrify
    query = query % self._escape_args(args, conn)
    TypeError: not all arguments converted during string formatting

    Process finished with exit code 1
  

Я считаю, что ошибка связана с типами данных — я думаю, что он путается со строками — но я просто не понимаю, что я должен изменить. Я пробовал использовать %s вместо ‘?’, но это привело к еще большему количеству ошибок.

Кроме того, я хотел бы упомянуть, что я получил сообщение об ошибке «TypeError: execute() принимает 2 или 3 аргумента 9 дано», которое я в конечном итоге исправил, добавив скобки в часть

 (row.DATE_TIME,
 row.PLANT_ID,
 row.SOURCE_KEY,
 row.DC_POWER,
 row.AC_POWER,
 row.DAILY_YIELD,
 row.TOTAL_YIELD,)
  

Заранее большое спасибо.

Ответ №1:

Заполнитель по умолчанию, используемый соединителем DB-API, определяется значением атрибута paramstyle модуля соединителя. В случае pymysql ,

 >>> pymysql.paramstyle
'pyformat'
  

это означает, что pymysql ожидает "%s" в качестве заполнителя, а не "?" . Стиль "%(name)s" также может использоваться, если передается сопоставление значений, а не кортеж.

Поэтому запрос должен быть

 '''INSERT INTO plants_data.dbo.plant_data(DATE_TIME,PLANT_ID,SOURCE_KEY,DC_POWER,AC_POWER,DAILY_YIELD,TOTAL_YIELD)
    VALUES(%s, %s, %s, %s, %s, %s, %s)'''
  

Комментарии:

1. спасибо, это помогло, мне удалось вставить данные в базу данных. Я пробовал то же самое раньше, и это не сработало o.O. В любом случае, я также удалил dbo часть в запросе INSERT и изменил таблицу и столбец DATE_TIME, поскольку он выдавал какую-то странную ошибку из-за формата даты и времени в наборе данных…