将DF表导入mysql报错“not enough arguments for format string”,这要怎么解决
```python
import requests
import re
import time
import numpy
import pymysql
import pandas
pro = ts.pro_api('48690a76aaebc59996fa91f2e789c28ff04d9092ca667ec9')
data = pro.daily(ts_code='002229.SZ', start_date='20210101', end_date='20230620')
df2 = data.iloc[:,0:6]
df2.columns=['股票代码','交易日期','开盘价','最高价','最低价','收盘价']
df3=np.array(df2)
df3=df3.tolist()
db = pymysql.connect(host='127.0.0.1', user='root', passwd='', database='python', port=3306 ,charset='utf8')
#如果用localhost就不行
cursor = db.cursor()
sql = "INSERT INTO 'stock_basic'(股票代码,交易日期,开盘价,收盘价) VALUES (%s,%s,%s,%s,%s,%s,%s)"
try:
cursor.executemany(sql,df3)
db.commit()
except Exception as e:
print(e)
db.rollback()
cursor.close()
db.close()
报错截图:
这里改改试试:
sql = "INSERT INTO 'stock_basic'(股票代码,交易日期,开盘价,收盘价) VALUES (%s,%s,%s,%s,%s,%s,%s)"
前面括号有(股票代码,交易日期,开盘价,收盘价)4个字段,与后面不对应, (%s,%s,%s,%s,%s,%s,%s),有7个%s,
正确写法:
sql = "INSERT INTO 'stock_basic'(股票代码,交易日期,开盘价,收盘价) VALUES (%s,%s,%s,%s)"
答案:
目前我使用的是pandas的to_sql()方法将DataFrame导入MySQL,但我遇到了报错,无法成功导入。为了更好地解决问题,我提供了详细的报错信息和代码。
首先是我的代码:
import pandas as pd
from sqlalchemy import create_engine
# 初始化数据库连接,使用pymysql模块
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
# 读取csv文件
df = pd.read_csv('data.csv', encoding='utf-8')
# 导入mysql数据库
df.to_sql(name='test_data', con=engine, if_exists='append', index=False)
然后是报错信息:
ProgrammingError: (pymysql.err.ProgrammingError) (1064, "You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''test_data' (`index` BIGINT, name TEXT, age BIGINT, sex TEXT, addr TEXT, work `) ENGINE=InnoDB' at line 1")
根据报错信息,可以看出是在SQL语句的语法上出现了错误,查看了报错信息后发现是SQL语句中的数据类型不正确。
经过查找并尝试修改数据类型,我最终解决了这个问题。修改后的代码如下:
import pandas as pd
from sqlalchemy import create_engine
# 初始化数据库连接,使用pymysql模块
engine = create_engine('mysql+pymysql://root:123456@localhost:3306/test')
# 读取csv文件
df = pd.read_csv('data.csv', encoding='utf-8')
# 修改DataFrame中的数据类型
df['age'] = df['age'].astype(int)
df['work_year'] = df['work_year'].astype(float)
# 导入mysql数据库
df.to_sql(name='test_data', con=engine, if_exists='append', index=False, chunksize=1000)
这里我使用了astype()方法将年龄列的数据类型修改为int,将工作年限列的数据类型修改为float,然后加了一个chunksize参数,以便更好地控制导入MySQL的速度。