質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.12%

PythonからRailsのPostgreSQLに接続してPythonで取得したデータを保存したい

受付中

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 167

katoyu

score 9

Python3でツイート群に対してMecabを用いた形態素解析を行い、その結果をRuby on railsを用いてWeb上で表示するアプリケーションを制作しています。

PythonからRailsのPostgreSQLに接続してPythonで取得したデータを保存したいと考えておりますが、接続の段階でうまくいかずにいます。

ディレクトリ構造は以下のようになってます。

twitrend /
     ├ db/
     ├ config/
     │ └ database.yml
     ├ db/
     │   ├ schema.rb
     │ └ migrate/
     │        └ 2019055323_create_item.rb
     └ postgre.py

主なファイル詳細です。

database.yml

# PostgreSQL. Versions 9.1 and up are supported.
#
# Install the pg driver:
#   gem install pg
# On OS X with Homebrew:
#   gem install pg -- --with-pg-config=/usr/local/bin/pg_config
# On OS X with MacPorts:
#   gem install pg -- --with-pg-config=/opt/local/lib/postgresql84/bin/pg_config
# On Windows:
#   gem install pg
#       Choose the win32 build.
#       Install PostgreSQL and put its /bin directory on your path.
#
# Configure Using Gemfile
# gem 'pg'
#
default: &default
  adapter: postgresql
  encoding: unicode
  # For details on connection pooling, see Rails configuration guide
  # http://guides.rubyonrails.org/configuring.html#database-pooling
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

development:
  <<: *default
  database: twitrend_development

  # The specified database role being used to connect to postgres.
  # To create additional roles in postgres see `$ createuser --help`.
  # When left blank, postgres will use the default role. This is
  # the same name as the operating system user that initialized the database.
  #username: twitrend

  # The password associated with the postgres role (username).
  #password:

  # Connect on a TCP socket. Omitted by default since the client uses a
  # domain socket that doesn't need configuration. Windows does not have
  # domain sockets, so uncomment these lines.
  #host: localhost

  # The TCP port the server listens on. Defaults to 5432.
  # If your server runs on a different port number, change accordingly.
  #port: 5432

  # Schema search path. The server defaults to $user,public
  #schema_search_path: myapp,sharedapp,public

  # Minimum log levels, in increasing order:
  #   debug5, debug4, debug3, debug2, debug1,
  #   log, notice, warning, error, fatal, and panic
  # Defaults to warning.
  #min_messages: notice

# Warning: The database defined as "test" will be erased and
# re-generated from your development database when you run "rake".
# Do not set this db to the same as development or production.
test:
  <<: *default
  database: twitrend_test

# As with config/secrets.yml, you never want to store sensitive information,
# like your database password, in your source code. If your source code is
# ever seen by anyone, they now have access to your database.
#
# Instead, provide the password as a unix environment variable when you boot
# the app. Read http://guides.rubyonrails.org/configuring.html#configuring-a-database
# for a full rundown on how to provide these environment variables in a
# production deployment.
#
# On Heroku and other platform providers, you may have a full connection URL
# available as an environment variable. For example:
#
#   DATABASE_URL="postgres://myuser:mypass@localhost/somedatabase"
#
# You can use this database configuration with:
#
#   production:
#     url: <%= ENV['DATABASE_URL'] %>
#
production:
  <<: *default
  database: twitrend_production
  username: twitrend
  password: <%= ENV['TWITREND_DATABASE_PASSWORD'] %>

下の方のproduction:以下の要素を引っ張ってきて下記ファイルに反映させました。

Pythonからのpostgreの接続についてはこちらの記事を参考にしました。

postgre.py

import psycopg2

path = "localhost"
port = "5432"
dbname = "twitrend_production"
user = "twitrend"
password = "ENV['TWITREND_DATABASE_PASSWORD']"

conText = "host={} port={} dbname={} user={} password={}"
conText = conText.format(path,port,dbname,user,password)
connection = psycopg2.connect(conText)
cur = connection.cursor()

コマンドラインで実行した結果は以下のようになりました。

/twitrend

$ python postgre.py 
Traceback (most recent call last):
  File "postgre.py", line 12, in <module>
    connection = psycopg2.connect(conText)
  File "/Users/katoyu/.pyenv/versions/anaconda3-5.2.0/lib/python3.6/site-packages/psycopg2/__init__.py", line 126, in connect
    conn = _connect(dsn, connection_factory=connection_factory, **kwasync)
psycopg2.OperationalError: FATAL:  role "twitrend" does not exist

抱えている問題は

  • コマンドラインではroleが存在しないと言われているが、postgre.pyの適切なディレクトリがわからない
  • パスワード(ENV['TWITREND_DATABASE_PASSWORD'])はどこかの.envファイルに設定されているパスワードを引っ張ってきているので間違いなくpythonファイル内ではこの書き方では扱えないので、どういう書き方をすべきか

という二点です。

  • 適切なディレクトリ構成やrole,passwordなどの値の渡し方
  • PythonじゃなくてRubyで書いたらうまくいくぞor楽だぞ

等ご意見いただけたらと思います。

各バージョン

  • Rails 5.2.3
  • Ruby 2.5.5
  • Python 3.6.3
  • psycopg2-2.8.3
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

+1

OSの世界とRailsの世界があります。
export TWITREND_DATABASE_PASSWORD = 'aaaaaaaaaaaaaa' はOSの世界で行うことで、そのあと「そのターミナルで」実行するプログラムには TWITREND_DATABASE_PASSWORD が渡されます。
注意! = の前後に空白を入れては駄目です。

Railsでは実行環境を指定しない時は development です。

>開発モードではデフォルトだとuserやpasswordの枠はなく、設定しなくても動作確認できるよ!
というのは、どこでも では無いです。
使っている環境では「developmentとtest用に準備されているDBにパスワードなどが設定されていない」ということです。設定してあるDBの場合は必要になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/21 10:29

    理解が曖昧で書き方も微妙になってしまっていました、すみません。

    >export TWITREND_DATABASE_PASSWORD = 'aaaaaaaaaaaaaa' はOSの世界で行うことで、そのあと「そのターミナルで」実行するプログラムには TWITREND_DATABASE_PASSWORD が渡されます。
    仰る通りです、詳細までありがとうございます。

    >注意! = の前後に空白を入れては駄目です。
    把握してませんでした、ありがとうございます。

    >Railsでは実行環境を指定しない時は development です。
    ご丁寧にありがとうございます。

    >使っている環境では「developmentとtest用に準備されているDBにパスワードなどが設定されていない」ということです。設定してあるDBの場合は必要になります。
    この件については日本語が悪かったです。今回の場合においてはなしで用いることができるが、パスワードが設定されている場合についてはもちろん入力が必要という認識ではありました。

    キャンセル

0

> パスワード(ENV['TWITREND_DATABASE_PASSWORD'])はどこかの.envファイルに設定されているパスワードを引っ張ってきているので

確かにそのとおりですが、、、、

パスワードが何であるか、もしくはどこに書かれているかをあなたが知らないとすると、あなたにはDBに直接アクセスする権限が与えられていないということですので、諦めて下さい。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

ひとまずテスト開発中では動作しましたので自己解決法を。

database.ymlは自動生成してからいじっていないので理解が薄かったのですが、開発モードではデフォルトだとuserやpasswordの枠はなく、設定しなくても動作確認できるよ!ってことでした。(いちいち認証っていうのも大変ってことでしょうか)

うまく動かなかったのですが、rails console test でコンソールを開いてRails.envと打つと開発モードかテストモードか本番モードかがわかるとのことで、おそらく開発モードなのでは?と思い、twitrend_productionからtwitrend_developmentへ変更してuserとpasswordの設定を全てコメントアウトすると、うまくDBに登録することができました。

例のENV['TWITREND_DATABASE_PASSWORD']では、/env/environmentにてexport TWITREND_DATABASE_PASSWORD = 'aaaaaaaaaaaaaa'みたいな指定の仕方をするらしいのですが、僕の環境はenvironmentファイルがなかったので作るのかな?とかそういう感じに思っています。
この辺りはおいおい...

この辺りについて何か他にご意見がありましたらいただきたいので、一応締めずに開けておきたいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.12%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる