【问题标题】:How to append a new column to a postgresql table from a dataframe from R如何从 R 的数据框中将新列附加到 postgresql 表
【发布时间】:2021-01-27 18:18:14
【问题描述】:

我正在尝试将新列从 R 附加或 cbind 到 postgresql 表。所以,我在 postgresql 表中创建了一个新列,我想在其中放置我的数据框列,即

ALTER TABLE schema.table
    ADD COLUMN newcolumn "char";
library(RPostgres)
library(tidyverse)
library(rpostgis)

# SQL CONNECTION

fun_connect<-function(){dbConnect(RPostgres::Postgres(),dbname = 'mydb', 
                                  host = 'localhost', # i.e. 'ec2-54-83-201-96.compute-1.amazonaws.com'
                                  port = 5432, # or any other port specified by your DBA
                                  user = 'postgres',
                                  password = 'secretpass'}

conn <- fun_connect()

mytable<-tbl(conn, "mydb")

# MY data frame

a<-data.frame(a= c("123","231543","1232","45389","4398543"))


# Trying to append or cbind my data frame column 

   #First try:
   
copy_to(conn,a,"newcolumn")

   #Second try:

RPostgreSQL::dbWriteTable(conn, "table", a,append=T)

So i Have the next error: 

Error: COPY returned error: ERROR:  el valor nulo en la columna «FIRSTcolumn» de la relación «table» viola la restricción de no nulo
DETAIL:  La fila que falla contiene (null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1).
CONTEXT:  COPY table, línea 1: «10208011005»

Third try:

pgInsert(conn, name=c("schema","table"), a)

But I get:
1 out of 1 columns of the data frame match database table columns and will be formatted for database insert.
Error : Failed to fetch row: ERROR:  el valor nulo en la columna «FIRSTcolumn» de la relación «table» viola la restricción de no nulo
DETAIL:  La fila que falla contiene (null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, null, 1).

Insert failed. No changes made to database.

所以我不知道如何以简单的方式将新列从 R 附加到 Postgresql。我问我是否存在类似于cbind(df, df2) (lol) 的东西,其中 df1 和 df2 具有相同的 nrow,但我都没有代理它是如何可能的

谢谢你的帮助。 问候!

【问题讨论】:

    标签: r postgresql dplyr dbplyr rpostgresql


    【解决方案1】:

    首先,您有两种不同类型的数据对象。一个是到远程(不在 R 内存中)sql 表的连接,另一个是本地(在 R 内存中)数据帧。这两种类型的对象不能立即组合。这意味着这些数据类型没有简单的cbind 等效项。

    我建议先将本地数据框复制到 sql 数据库中。然后,您将拥有两个相同类型的数据对象 - 两个 sql 表 - 您可以将它们组合起来。

    您尝试使用copy_todbWriteTable 是一个好的开始。但是这些函数将整个 R 数据帧写入整个表,而不是作为一部分。

    为了将数据框复制到我使用的 sql 中:

    DBI::dbWriteTable(
          db_connection,
          DBI::Id(
            catalog = db,
            schema = schema,
            table = sql_table_name
          ),
          r_table_name
    )
    

    您正在寻找插入值的 sql 语法很可能是:

    INSERT INTO first_table(names_of_columns1) SELECT names_of_columns2 FROM second_table;
    

    我会在 R 中进行如下处理:

    insert_into_column <- function(connection, tbl1, col1, tbl2, col2){
        prep = tbl2 %>% select(col2)
    
        query <- glue::glue("INSERT INTO {tbl1} ({col1})\n",
                            dbplyr::sql_render(prep))
    
        result <- DBI::dbExecute(connection, as.character(query))
    }
    

    请注意,将值插入 sql 表的列可能与将值插入 R 数据框的列不同。 sql中的表默认是不排序的,所以你的insert可能无法保证正确的顺序。

    【讨论】:

    • 感谢您的回答!只是我需要处理来自 postgresql 的数据,因为我在 .csv 中有非常重的数据,而在 R 中处理它的速度非常慢。
    • 对不起,从您的评论中我不确定我的回答是否足够,或者还有其他问题需要解决。请你澄清一下?
    • Simon.S.A.很抱歉我回答晚了,最后我以这种方式解决了这个问题:stackoverflow.com/questions/224732/…我使用 SQL 中的 UPDATE 并且效果很好,感谢您的时间!
    猜你喜欢
    • 1970-01-01
    • 2012-09-26
    • 2017-10-17
    • 1970-01-01
    • 2019-01-22
    • 2022-01-17
    • 2014-01-08
    • 2019-09-08
    • 2021-02-06
    相关资源
    最近更新 更多