【发布时间】:2019-05-02 15:29:39
【问题描述】:
我有一个 MS Access 表 (SearchAdsAccountLevel),需要经常从 python 脚本更新。我已经建立了 pyodbc 连接,现在我想根据 Date_ 和 CampaignId 字段是否与 df 数据匹配,将我的 pandas df 中的行更新/插入到 MS Access 表中。
查看前面的示例,我构建了 UPDATE 语句,该语句使用 iterrows 遍历 df 中的所有行并按以下方式执行 SQL 代码:
connection_string = (
r"Driver={Microsoft Access Driver (*.mdb, *.accdb)};"
r"c:\AccessDatabases\Database2.accdb;"
)
cnxn = pyodbc.connect(connection_string, autocommit=True)
crsr = cnxn.cursor()
for index, row in df.iterrows():
crsr.execute("UPDATE SearchAdsAccountLevel SET [OrgId]=?, [CampaignName]=?, [CampaignStatus]=?, [Storefront]=?, [AppName]=?, [AppId]=?, [TotalBudgetAmount]=?, [TotalBudgetCurrency]=?, [DailyBudgetAmount]=?, [DailyBudgetCurrency]=?, [Impressions]=?, [Taps]=?, [Conversions]=?, [ConversionsNewDownloads]=?, [ConversionsRedownloads]=?, [Ttr]=?, [LocalSpendAmount]=?, [LocalSpendCurrency]=?, [ConversionRate]=?, [Week_]=?, [Month_]=?, [Year_]=?, [Quarter]=?, [FinancialYear]=?, [RowUpdatedTime]=? WHERE [Date_]=? AND [CampaignId]=?",
row['OrgId'],
row['CampaignName'],
row['CampaignStatus'],
row['Storefront'],
row['AppName'],
row['AppId'],
row['TotalBudgetAmount'],
row['TotalBudgetCurrency'],
row['DailyBudgetAmount'],
row['DailyBudgetCurrency'],
row['Impressions'],
row['Taps'],
row['Conversions'],
row['ConversionsNewDownloads'],
row['ConversionsRedownloads'],
row['Ttr'],
row['LocalSpendAmount'],
row['LocalSpendCurrency'],
row['ConversionRate'],
row['Week_'],
row['Month_'],
row['Year_'],
row['Quarter'],
row['FinancialYear'],
row['RowUpdatedTime'],
row['Date_'],
row['CampaignId'])
crsr.commit()
我想遍历我的 df 中的每一行(大约 3000),如果 ['Date_'] AND ['CampaignId'] 匹配我更新所有其他字段。否则我想在我的访问表中插入整个 df 行(创建新行)。实现这一目标最有效和最有效的方法是什么?
【问题讨论】:
-
有很多方法和步骤来冒犯您的问题。 1-不要一一执行查询,使用参数化查询。 2- 在 python 中使用 yield's ...
-
@Ilmari - 完成。感谢您的提醒。
标签: python pandas ms-access pyodbc