R PostgreSQL - 数据表中没有更新数据

时间:2015-10-30 15:57:00

标签: r postgresql rpostgresql

您好我正在尝试使用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)
}

如果我做错了什么,谁能让我知道?任何帮助都非常感谢

3 个答案:

答案 0 :(得分: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返回时,将始终提交封闭事务,就像使用纯SQL执行UPDATE时一样。除非您使用COMMIT创建了新的交易,否则请勿致电BEGIN TRANSACTION

警告&#34;没有正在进行的交易&#34;是PostgreSQL的一种方式告诉你,你发布了COMMIT语句而没有发出BEGIN TRANSACTION语句,这正是你在函数中所做的。

答案 1 :(得分:0)

简化,简化和简化 - RPostgreSQL从一开始就已经对这些类型的操作进行了单元测试(2008年不会少),这样做(除非你有数据库设置问题)。

参见所有测试的here in the GitHub repo

答案 2 :(得分:0)

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