在字符串格式化读取csv、元组迭代、写入数据库期间,并非所有参数都已转换

2024-10-03 17:20:49 发布

您现在位置:Python中文网/ 问答频道 /正文

我还是个初学者,我在这个问题上坚持了一段时间。 我试图重新创建这个https://datatofish.com/import-csv-sql-server-python/,但是有更多的列,甚至更多的行

数据集来自https://www.kaggle.com/anikannal/solar-power-generation-data-->; Plant_1_Generation_Data.csv

这个计划的想法是什么读取CSV格式的随机数据集并将这些数据插入我的SQL数据库

数据库连接正常。 已成功创建一个表,该表在数据库中可见

代码如下。请注意,我对“createtable”查询进行了注释,因为该表已经创建

import pandas as pd
import pymysql

'''defining attributes and csv reading'''

data = pd.read_csv(r'E:\Programiranje\csv_practice\Plants data\Plant_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:\Programiranje\csv_practice\Scripts\python.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:\Programiranje\csv_practice\lib\site-packages\pymysql\cursors.py", line 161, in execute
    query = self.mogrify(query, args)
    File "E:\Programiranje\csv_practice\lib\site-packages\pymysql\cursors.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个给定的参数”,我最终通过在部分中添加括号修复了这个错误

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

非常感谢


Tags: csvkeyidsourcedatadatetimedc
1条回答
网友
1楼 · 发布于 2024-10-03 17:20:49

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)'''

相关问题 更多 >