私は次のコマンドを使用しています:
copy (select so.name,
so.date_order,
sol.name,
sol.product_Id,
sol.product_uom_qty ,
ai.number,
ai.date_invoice ,
so.amount_total ,
so.amount_tax
from sale_order so ,
sale_order_line sol ,
account_invoice ai
where so.id = sol.order_id
and so.name = ai.Origin
and ai.state='open')
to '/home/ekodev/Documents/test1.csv' delimiter ',' csv header;
ただし、次のエラーが発生します。
********** Error **********
ERROR: must be superuser to COPY to or from a file
SQL state: 42501
Hint: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
許可を変更した場合でもekodev@partner:~/Documents$ Sudo chmod a+rwX /home/ekodev/ /home/ekodev/Documents/ /home/ekodev/Documents/test1.csv
私にはまだ機能しません。
誰が問題が何であるか知っていますか?
ドキュメント不足:
ファイルに名前を付けるCOPYは、サーバーにアクセスする権限があるファイルの読み取りまたは書き込みを許可するため、データベースのスーパーユーザーにのみ許可されます。
つまり、データベースユーザーにはスーパーユーザーフラグが必要です。フラグを設定できます
ALTER ROLE <rolename> WITH SUPERUSER
これは静かになる可能性があるため、クライアント側からデータをコピーする代わりにpsqlから\ copyを使用することを検討しました。
このソリューションは、\copy
。 ALTERは管理者権限も必要としなかったため、必要ありませんでした。
psql -h <Host> -U <user> -d <dbname> -c "\copy <table_name> FROM '<path to csvfile/file.csv>' with (format csv,header true, delimiter ',');"
または、pgAdminを使用してcsvデータをインポートできます。たとえば、AWSのようにSuperUserロールが使用できない場合に機能します。
クエリを実行しているロールは、SUPERUSER
to COPY FROM
ファイルである必要があります。それ以外の場合は、STDIN
からのみコピーできます。