sql >> データベース >  >> RDS >> PostgreSQL

RからPostgreSQLでテーブルを作成する方法は?

    わかりました。なぜdbWriteTable()なのかわかりません。 失敗するでしょう。ある種のバージョン/プロトコルの不一致がある可能性があります。可能であれば、Rの最新バージョンであるRPostgreSQLパッケージをインストールし、システムにPostgreSQLサーバーをアップグレードしてみてください。

    insert intoについて 大量のデータの回避策が失敗する場合、大量のデータを移動する必要があり、ワンショット転送が実行不可能/非現実的/不安定な場合にITの世界でよく行われることは、バッチ処理と呼ばれることもあります。 またはバッチ処理 。基本的に、データを小さなチャンクに分割し、各チャンクを一度に1つずつ送信します。

    ランダムな例として、数年前、一度に1000レコードしか提供しないように制約されたHRLDAPサーバーから従業員情報を照会するJavaコードを作成しました。したがって、基本的に、同じリクエストを送信し続けるためにループを作成する必要がありました(ある種の奇妙なCookieベースのメカニズム )サーバーがクエリの完了を報告するまで、レコードをローカルデータベースに蓄積します。

    これは、SQLを手動で作成して、指定されたdata.frameに基づいて空のテーブルを作成し、パラメーター化されたバッチサイズを使用してdata.frameのコンテンツをテーブルに挿入するコードです。これは主にpaste()の呼び出しを中心に構築されています SQL文字列を作成するには、dbSendQuery() 実際のクエリを送信します。 postgresqlDataType()も使用します テーブル作成用。

    ## connect to the DB
    library('RPostgreSQL'); ## loads DBI automatically
    drv <- dbDriver('PostgreSQL');
    con <- dbConnect(drv,host=...,port=...,dbname=...,user=...,password=...);
    
    ## define helper functions
    createEmptyTable <- function(con,tn,df) {
        sql <- paste0("create table \"",tn,"\" (",paste0(collapse=',','"',names(df),'" ',sapply(df[0,],postgresqlDataType)),");");
        dbSendQuery(con,sql);
        invisible();
    };
    
    insertBatch <- function(con,tn,df,size=100L) {
        if (nrow(df)==0L) return(invisible());
        cnt <- (nrow(df)-1L)%/%size+1L;
        for (i in seq(0L,len=cnt)) {
            sql <- paste0("insert into \"",tn,"\" values (",do.call(paste,c(sep=',',collapse='),(',lapply(df[seq(i*size+1L,min(nrow(df),(i+1L)*size)),],shQuote))),");");
            dbSendQuery(con,sql);
        };
        invisible();
    };
    
    ## generate test data
    NC <- 1e2L; NR <- 1e3L; df <- as.data.frame(replicate(NC,runif(NR)));
    
    ## run it
    tn <- 't1';
    dbRemoveTable(con,tn);
    createEmptyTable(con,tn,df);
    insertBatch(con,tn,df);
    res <- dbReadTable(con,tn);
    all.equal(df,res);
    ## [1] TRUE
    

    row.namesの前にわざわざ追加しなかったことに注意してください dbWriteTable()とは異なり、データベーステーブルへの列 、これには常にそのような列が含まれているようです(そして、それを防ぐ手段を提供していないようです)。



    1. NVLとCoalesceのOracleの違い

    2. ON CONFLICT句でplpgsql変数名を明確にする方法は?

    3. Explainに基づくMySQLの最適化

    4. 制限を超えると、主キーIDはどうなりますか?