从 pandas DataFrame 插入访问数据库

Posted

技术标签:

【中文标题】从 pandas DataFrame 插入访问数据库【英文标题】:INSERT INTO Access database from pandas DataFrame 【发布时间】:2019-02-03 18:32:25 【问题描述】:

请有人告诉我插入到数据库中但在 python 中的所有数据框应该是什么样子?

我找到了这个,但不知道如何插入所有名为 test_data 的数据框,其中包含两个数字:ID、Employee_id。

我也不知道如何为 ID 插入下一个值(类似于 nextval)

谢谢

import pyodbc 
conn = pyodbc.connect(r'Driver=Microsoft Access Driver (*.mdb);DBQ=C:\Users\test_database.mdb;')
cursor = conn.cursor()  
cursor.execute('''
                INSERT INTO employee_table (ID, employee_id)
                VALUES(?????????)
              ''')
conn.commit()

【问题讨论】:

您可能想使用to_sql。您现在正在执行 SQL 以使用光标手动添加值。不需要带有to_sql 的游标,只需连接到您的数据库即可。 您打算如何插入整个数据框而不进行迭代?更好地搜索 pandas 数据框的 to_sql 方法,这在这种情况下非常有用 【参考方案1】:

2020 年 6 月更新:

现在sqlalchemy-access 方言已经恢复,最好的解决方案是使用pandas 的to_sql 方法。

https://pandas.pydata.org/pandas-docs/stable/reference/api/pandas.DataFrame.to_sql.html


(上一个答案)

您可以使用 pyodbc 的 executemany 方法,使用 pandas 的 itertuples 方法传递行:

print(pyodbc.version)  ## 4.0.24 (not 4.0.25, which has a known issue with Access ODBC)
connection_string = (
    r'DRIVER=Microsoft Access Driver (*.mdb, *.accdb);'
    r'DBQ=C:\Users\Public\MyTest.accdb;'
)
cnxn = pyodbc.connect(connection_string, autocommit=True)
crsr = cnxn.cursor()

# prepare test environment
table_name = "employee_table"
if list(crsr.tables(table_name)):
    crsr.execute(f"DROP TABLE [table_name]")
crsr.execute(f"CREATE TABLE [table_name] (ID COUNTER PRIMARY KEY, employee_id TEXT(25))")

# test data
df = pd.DataFrame([[1, 'employee1'], [2, 'employee2']], columns=['ID', 'employee_id'])

# insert the rows from the DataFrame into the Access table    
crsr.executemany(
    f"INSERT INTO [table_name] (ID, employee_id) VALUES (?, ?)",
    df.itertuples(index=False))

更新: 像这样的参数化查询再次适用于 pyodbc 版本 4.0.27,但不适用于 4.0.25(如上所述)或 4.0.26。尝试使用这些版本将导致“未实现可选功能”错误。这个问题在这里讨论https://github.com/mkleehammer/pyodbc/issues/509。

【讨论】:

Executemany 非常棒。我只有插入 Null 值的问题(只清空行中的一些值,但它们必须保持为空)。有什么方法可以向这个插入添加参数吗?非常感谢【参考方案2】:

使用to_sql 你可以这样做:

test_data.to_sql('employee_table', engine, index=False, if_exists='append')

这会将 test_data 的值添加到员工表的末尾。

【讨论】:

现在sqlalchemy-access 方言已经恢复,这应该是首选解决方案。

以上是关于从 pandas DataFrame 插入访问数据库的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:DataFrame数据的更改插入新增的列和行

访问 python 子列表以导入 pandas DataFrame

pandas在dataframe数据列中插入全是全是固定数值或者固定文本内容的数据列(add a column to pandas dataframe with constant values)

pandas使用assign函数在dataframe数据列中插入全是全是缺失值(NaN)的数据列(add an empty column in dataframe)

如何在 pandas.DataFrame 中插入满足条件的行值

根据日期列在pandas Dataframe中插入行