0

您好我正在尝试使用 RpostgreSQL 包更新 postgresql 表,R 中的命令已成功执行,但新数据未反映在数据库中。以下是我在 R 中执行的命令

for(i in new_data$FIPS) {
  drv <- dbDriver("PostgreSQL")
  con <- dbConnect(drv, dbname="ip_platform", host="******", port="5432", user="data_loader", password="******")
  txt <- paste("UPDATE adminvectors.county SET attributes= hstore('usco@TP-TotPop@2010'::TEXT,",new_data$TP.TotPop[new_data$FIPS == i],"::TEXT) where geoid ='",i,"'")
  dbGetQuery(con, txt)
  dbCommit(con)
  dbDisconnect(con)
}

如果我做错了什么,谁能告诉我?非常感谢任何帮助

4

3 回答 3

0

您正在调用 dbGetQuery 而不是 dbSendQuery 并且还在 for 循环中断开与数据库的连接。您还将为每个循环迭代创建一个新的连接对象,这不是必需的。尝试这个:

drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, dbname="ip_platform", host="******", port="5432", user="data_loader", password="******")

for(i in new_data$FIPS) {
  txt <- paste("UPDATE adminvectors.county SET attributes= hstore('usco@TP-TotPop@2010'::TEXT,",new_data$TP.TotPop[new_data$FIPS == i],"::TEXT) where geoid ='",i,"'")
  dbSendQuery(con, txt)
}

dbDisconnect(con)

你不应该dbCommit(con)明确地打电话。当 dbSendQuery 返回时,将始终提交封闭事务,就像UPDATE使用纯 SQL 执行时一样。除非您COMMIT使用BEGIN TRANSACTION.

警告“没有正在进行的事务”是 PostgreSQL 告诉你你已经发布了一个COMMIT声明而没有发布一个BEGIN TRANSACTION声明的方式,这正是你在你的函数中所做的。

于 2015-10-30T16:35:03.107 回答
0

简化、简化、简化——RPostgreSQL 从一开始就对这些类型的操作进行了单元测试(至少在 2008 年)并且这很有效(除非您有数据库设置问题)。

例如,请参阅 GitHub 存储库中的所有测试。

于 2015-10-30T16:42:15.617 回答
0

感谢您的所有投入。问题在于我在 for 循环中使用的 paste() 函数。由于 where 条件失败,因此 paste() 函数已将查询中的逗号替换为空格。我在 paste() 中添加了一个 sep="" 属性,现在查询已正确发送到数据库,并且行正在按预期更新。

于 2015-11-03T14:35:11.890 回答