CSVファイルを読み込んでpostgreSQLのデータベーステーブルにデータを追加する処理を実行したいです。
batファイルを実行してpostgreSQLのデータベーステーブルをtruncate文でデータを削除した後、
CSVのデータを取り込むプログラムを作っているんですが、データ取り込みの段階でどうしてもエラーが出ます。
エラーメッセージ
psql:C:/Users/Administrator/Desktop/renkeitest/sql/import_atena.sql:2: :: Invalid argument
該当のソースコード
sqlファイルの中身
\echo :csvdir
\COPY bch154610.tcat_atena FROM :'csvdir' WITH (FORMAT csv, HEADER, ENCODING 'UTF8');
試したこと
\echo :csvdirでファイルパスを確認していますが、ファイルの存在も確認できています。
FROM句に\echoで出力されたファイルパスを直接記述すると処理が実行できました。
batファイルを実行したところ、TRUNCATEの処理までは実行できていたのでデータベース自体には
接続もできているはずです。
%ATENACSV%をダブルクォーテーションで囲んでみたりもしましたがうまくいきませんでした。
変数で処理しようとするとどうしてもうまくいかないです。
投稿するのも初めてなのですが、よろしくお願いいたします。
補足情報(FW/ツールのバージョンなど)
postgreSQLのバージョン psql (PostgreSQL) 11.5
batファイルのソースコード
@echo off
setlocal
chcp 65001 > nul
rem postgre 接続情報
set HOST=****
set PORT=****
set DBNAME=****
set NLS_LANG=Japanese_Japan.JA16SJIS
set PGCLIENTENCODING=UTF8
set USER=****
set PGPASSWORD=****
rem CSVファイルの出力先フォルダ
set "CSVDIR=C:\Users\Administrator\Desktop\renkeitest\csv"
rem logファイルの出力先フォルダ
set "LOGDIR=C:\Users\Administrator\Desktop\renkeitest\log"
rem バッチファイルのあるディレクトリを取得
set "BASE_DIR=%~dp0"
rem SQLファイル名
set "IMPORT_ATENA=%BASE_DIR%sql\import_atena.sql"
rem 連携ファイル名
set "ATENACSV=%CSVDIR%\ATENA.csv"
for /f "tokens=1-3 delims=/" %%a in ("%DATE%") do (
set YYYY=%%a
set MM=%%b
set DD=%%c
)
set "TODAY=%YYYY%%MM%%DD%"
rem ログファイル名を日付入りに
set "LOGFILE=%LOGDIR%\import_log_%TODAY%.log"
echo 処理を開始
echo [%DATE% %TIME%] 開始 >> %LOGFILE%
echo テーブルの初期化を実行中…
rem 宛名テーブルのデータ削除
echo [%DATE% %TIME%] テーブルを初期化中... >> %LOGFILE%
psql -v ON_ERROR_STOP=1 -h %HOST% -p %PORT% -U %USER% -d %DBNAME% -c "TRUNCATE TABLE bch154610.tcat_atena;" >> %LOGFILE% 2>&1
if %errorlevel%==0 (
echo 宛名テーブルの初期化に成功
echo [%DATE% %TIME%] 宛名テーブルの初期化に成功 >> %LOGFILE%
) else (
echo 宛名テーブルの初期化に失敗
pause
exit /b 1
)
echo テーブルの初期化を完了
set "ATENACSV=%ATENACSV:=/%"
echo %ATENACSV%
echo CSVデータを取り込み中…
rem CSVデータの取り込み
echo [%DATE% %TIME%] CSVインポート開始 >> %LOGFILE%
psql -v ON_ERROR_STOP=1 -h %HOST% -p %PORT% -U %USER% -d %DBNAME% -v csvdir=%ATENACSV% -f %IMPORT_ATENA% >> "%LOGFILE%" 2>&1
if %errorlevel%==0 (
echo 宛名テーブルの連携に成功
) else (
echo 宛名テーブルの連携に失敗
pause
exit /b 1
)
echo CSVデータのインポートが完了しました。
pause
endlocal
exit /b

回答1件
あなたの回答
tips
プレビュー