【postgreSQL】PHPでDBのデータをCSVに出力したい
PHPファイル内で、postgreSQLを使いデータベース上のテーブルデータ全てをCSVファイルにしたいのですが、色々調べてはみたものの、解決できませんでした。
postgreSQLにお詳しい方、ご教示頂ければ幸いで御座います。
該当のソースコード
<?php
// PostgreSQLに接続
$conn = pg_connect('host=localhost dbname=test
user=XXXXX password=XXXXX');
// SQL文を実行
$query = "COPY test_json TO '/tmp/sampletbl1.csv' CSV";
pg_query($conn, $query);
// PostgreSQLを切断
$close = pg_close($conn);
?>
補足情報
・/tmp/sampletbl1.csv が作成されない状態です。
・MAMPを使用しております。
・DB接続は成功しております。
・PHPのエラーは発生致しておりません。
・PHPのバージョン:5.6.30
・PostgreSQLのバージョン:10.5
・MAMPのバージョン:5.0.1
・データベースにつきまして
ホスト名:localhost
DB名:test
取得したいテーブル名:test_json
取得後のCSVファイル名:sampletbl1.csv
-
気になる質問をクリップする
クリップした質問は、後からいつでもマイページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
クリップを取り消します
-
良い質問の評価を上げる
以下のような質問は評価を上げましょう
- 質問内容が明確
- 自分も答えを知りたい
- 質問者以外のユーザにも役立つ
評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。
質問の評価を上げたことを取り消します
-
評価を下げられる数の上限に達しました
評価を下げることができません
- 1日5回まで評価を下げられます
- 1日に1ユーザに対して2回まで評価を下げられます
質問の評価を下げる
teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。
- プログラミングに関係のない質問
- やってほしいことだけを記載した丸投げの質問
- 問題・課題が含まれていない質問
- 意図的に内容が抹消された質問
- 過去に投稿した質問と同じ内容の質問
- 広告と受け取られるような投稿
評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。
質問の評価を下げたことを取り消します
この機能は開放されていません
評価を下げる条件を満たしてません
質問の評価を下げる機能の利用条件
この機能を利用するためには、以下の事項を行う必要があります。
- 質問回答など一定の行動
-
メールアドレスの認証
メールアドレスの認証
-
質問評価に関するヘルプページの閲覧
質問評価に関するヘルプページの閲覧
checkベストアンサー
+1
sql を psql で実行できますか?
当方、
copy テーブル名 to '/パス/ファイル名.csv' with csv;
でないと実行できませんでしたが・・・
パスは postgres ユーザの書き込み権限が必要です。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
'/tmp/sampletbl1.csv'
なるファイルへのアクセス権が
webサーバープログラム自身にあるかどうか
確認をお願いします。
それと、
db接続ユーザーの権限でCOPY文が実行される上で、
db接続ユーザーとOS上ユーザーの紐づけがされるクライアント認証を採用していれば、
OSユーザーが誰になっているかの権限も確認したほうが良いです。
MAMPだとApache httpdでしょうか。
コードについて。
// SQL文を実行
$query = "COPY test_json TO '/tmp/sampletbl1.csv' CSV";
$result = pg_query($conn, $query);
if ($result === FALSE) {
echo "An error occurred.\n";
echo pg_last_error($conn) . "\n";
exit;
}
とかすればphp上ではなくPostgreSQLアクセスでのエラーなら表示されるかも。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
+1
直接回答に繋がらないかもしれませんが、if文でpg_queryの戻り値ではなく、$queryを判定してますよ。
クエリー結果が正しいかそれでは判定できてません。
投稿
-
回答の評価を上げる
以下のような回答は評価を上げましょう
- 正しい回答
- わかりやすい回答
- ためになる回答
評価が高い回答ほどページの上位に表示されます。
-
回答の評価を下げる
下記のような回答は推奨されていません。
- 間違っている回答
- 質問の回答になっていない投稿
- スパムや攻撃的な表現を用いた投稿
評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。
15分調べてもわからないことは、teratailで質問しよう!
- ただいまの回答率 88.10%
- 質問をまとめることで、思考を整理して素早く解決
- テンプレート機能で、簡単に質問をまとめられる
2018/08/24 12:29
psqlを実行できるようにするにはどうしたら良いものでしょうか?
2018/08/24 12:45
であれば、起動しているプログラムは pg_ctl のはず。
psql は pg_ctl と同じディレクトリに存在しているはずですが・・・ありませんか?
2018/08/24 13:12 編集
「postgres」には格納されているようで御座います。
PG_VERSION
pg_logical
pg_tblspc
pg_multixact
pg_twophase
pg_wal
global
pg_replslot
pg_xact
pg_serial
postgresql.auto.conf
pg_commit_ts
pg_snapshots
postgresql.conf
pg_dynshmem
pg_stat
postmaster.opts
pg_hba.conf
pg_stat_tmp
postmaster.pid
pg_ident.conf pg_subtrans
2018/08/24 13:36
2018/08/24 13:41
postgresql実行物がごっそり置かれる場所が絶対あるはずです。
https://qiita.com/_daisuke/items/13996621cf51f835494b
を参照するに、
/usr/local/Cellar/postgresql/9.3.4/bin/
にpsqlコマンドがありそう。
2018/08/24 13:47
/usr/local/binの中に、「psql」 と 「pg_ctl 」御座いました!
失礼致しました。
また、データベースはmacのMAMPにて起動致しております。
2018/08/24 13:56
2018/08/24 14:01
brew services start postgresql
有難うございます。
2018/08/24 14:21
ファイルへのアクセス権につきまして、「tem」フォルダ「sampletbl1.csv」ともに、すべてのユーザーに読み書き権限を付与し、再起動をして、今一度動作確認致しましたが、CSVファイルの中身は更新されない状態は続いております。
アクセス権の設定が必要で有る事、大変勉強になりました。有難うございます。
2018/08/24 14:35
2018/08/24 14:53
ターミナルよりsql を実行致しましたら、以下のエラー表示されました。
ERROR: syntax error at or near "psql"
LINE 1: psql "COPY test_json TO '/tmp/sampletbl1.csv' CSV";
2018/08/24 14:54
パスに不備がある事が分かりました!
以下のパスの修正を行い、無事にデータベースの情報がCSVファイルへ反映される事を確認致しました。
showkit 様のご指摘にて、無事に問題解決致しました。
お忙しい中、ご教示頂き有りとうございました!
また大変勉強になりました。
'/tmp/sampletbl1.csv' CSV";
↓
'/Applications/MAMP/htdocs/tmp/sampletbl1.csv’;