我正在尝试将数据从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的方法,这也会有帮助,我只需要知道如何导出我的数据。
发布于 2017-10-16 12:31:27
正如评论中所说的,to_sql只支持sqlite3
一个示例方法可以逐行解析数据帧,并将每一行插入一个表中:
import pyodbc
import pandas as pd
conn_str = (
r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};'
r'DBQ=C:\Users\Erik\Desktop\TestDb.accdb;'
)
cnxn = pyodbc.connect(conn_str)
SQL = 'SELECT * FROM Index_data;'
dfins = pd.read_sql(SQL, cnxn)
for index, row in dfins.iterrows():
with cnxn.cursor() as crsr:
crsr.execute("INSERT INTO Output(Field1, Field2) VALUES(?,?)", row["F1"], row["F2"] ) 这会将F1和F2列DataFrame插入到名为Output的表的字段Field1和Field2中。
这有两个主要条件可以正常工作:
您可以使用预先存在的表,比如从索引表中获取数据,尽管我不建议使用它(可能会丢失数据)。如果这样做,您需要首先清除表。要清除索引表,请执行以下操作:
with cnxn.cursor() as crsr:
crsr.execute("DELETE * FROM Index_data;")发布于 2017-10-16 17:57:17
考虑将熊猫数据导出到CSV文件,然后运行中的内联查询,因为Jet/ACE SQL引擎允许直接查询CSV。请注意,文件夹是文件名上带有句点限定符的数据库。相应地调整列。
import pyodbc
import pandas as pd
conn_str = r'DRIVER={Microsoft Access Driver (*.mdb, *.accdb)};DBQ=H:\Work\IndexTrader\Data\database\IndexData.accdb;'
cnxn = pyodbc.connect(conn_str)
...
dfins.to_csv(r'C:\Path\To\myCSVFile.csv', index=False)
cur = cnxn.cursor()
cur.execute("INSERT INTO Index_data (Col1, Col2, Col3)" + \
" SELECT Col1, Col2, Col3" + \
" FROM [text;HDR=Yes;FMT=Delimited(,);Database=C:\Path\To\Folder].myCSVFile.csv t")
cnxn.commit()发布于 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
复制相似问题