您好我正在尝试使用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)
}
如果我做错了什么,谁能让我知道?任何帮助都非常感谢
答案 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()中的属性和查询现在已正确发送到数据库,并且行按预期更新。