105

CSV ファイルを Postgres テーブルにコピーしたいと考えています。この表には約 100 列あるので、必要がなければ書き直したくありません。

コマンドを使用して\copy table from 'table.csv' delimiter ',' csv;いますが、テーブルを作成せずにERROR: relation "table" does not exist. 空のテーブルを追加してもエラーは発生しませんが、何も起こりません。このコマンドを 2、3 回試しましたが、出力もメッセージもありませんでしたが、PGAdmin で確認したところ、テーブルは更新されていませんでした。

私がやろうとしているように、ヘッダーが含まれているテーブルをインポートする方法はありますか?

4

5 に答える 5

28

Python ライブラリpandasを使用すると、列名を簡単に作成し、csv ファイルからデータ型を推測できます。

from sqlalchemy import create_engine
import pandas as pd

engine = create_engine('postgresql://user:pass@localhost/db_name')
df = pd.read_csv('/path/to/csv_file')
df.to_sql('pandas_db', engine)

if_existsパラメータは、既存のテーブルを置換または追加するように設定できますdf.to_sql('pandas_db', engine, if_exists='replace')。これは、追加の入力ファイル タイプでも機能します。 docs hereおよびhere

于 2015-04-30T00:45:31.150 に答える
13

無許可端末による代替

NOTESのpgドキュメントは 言う

パスは、クライアントの作業ディレクトリではなく、サーバー プロセスの作業ディレクトリ (通常はクラスタのデータ ディレクトリ) に対して相対的に解釈されます。

したがって、一般的に、psqlまたは任意のクライアントを使用すると、ローカルサーバーであっても問題が発生します...そして、他のユーザーに対して COPY コマンドを表現している場合、たとえば. Github README では、読者は問題を抱えているでしょう...

クライアント権限で相対パスを表現する唯一の方法は、 STDINを使用することです。

STDIN または STDOUT を指定すると、クライアントとサーバー間の接続を介してデータが送信されます。

ここで覚えているように:

psql -h remotehost -d remote_mydb -U myuser -c \
   "copy mytable (column1, column2) from STDIN with delimiter as ','" \
   < ./relative_path/file.csv
于 2017-01-04T13:22:32.760 に答える