我正在尝试将数据从python熊猫数据框架导出到现有的MS访问表中,我想用我尝试使用的pandas.to_sql更新的数据(在python中)替换MS访问表,但是我得到了一个错误消息。我觉得这很奇怪,使用pandas.read_sql可以无缝地工作吗?
这是我的代码:
import pyodbc
import pandas as pd
conn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=H:\Work\IndexTrader\Data\database\IndexData.accdb;'
)
cnxn = pyodbc.connect(conn_str)
SQL = 'SELECT * FROM Index_data;从MS读取数据很好,见下文
dfins = pd.read_sql(SQL, cnxn)然而,当我试图回写并替换MS过剩的表时,它不起作用吗?
dfins.to_sql('Index_data', cnxn, if_exists='replace')
cnxn.close()我得到的错误是:
DatabaseError: Execution failed on sql 'SELECT name FROM sqlite_master WHERE type='table' AND name=?;': ('42S02', "[42S02] [Microsoft][ODBC Microsoft Access Driver] The Microsoft Access database engine cannot find the input table or query 'sqlite_master'. Make sure it exists and that its name is spelled correctly. (-1305) (SQLExecDirectW)")如果有替代pandas.to_sql的方法,这也会有帮助,我只需要知道如何导出我的数据。
发布于 2021-03-06 04:08:34
只是为了跟进帕法特的回答。我喜欢在ms access中使用内联查询的想法,而不是在dataframe中迭代行。但是,我遇到了一个问题,就是那些看上去是数字的字段(在Excel或Access中);那些字段的前导为零。在我的环境里有很多这样的东西。对于这些,我只是使用csv模块用引号对它们进行包装。就像这样:
from pathlib import Path
import csv
csv_file = Path(Path.cwd(), ms_access_table_name + '.csv')
my_df.to_csv(csv_file, sep = ',', quoting=csv.QUOTE_NONNUMERIC , index=False)
ms_sql = f'INSERT INTO {ms_access_table_name} ({ms_access_columns}) \n' +\
f'SELECT {ms_access_columns} \n' + \
f'FROM [text;HDR=Yes;FMT=Delimited(,);IMEX=2;Database={Path.cwd()}].{ms_access_table_name + ".csv"}'
cursor.execute(ms_sql)
cursor.commit()
cursor.close()
conn.close()https://stackoverflow.com/questions/46767614
复制相似问题