#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, поскольку он выдавал какую-то странную ошибку из-за формата даты и времени в наборе данных…