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

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

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

1回答

2930閲覧

ActiveRecordでpostgreSQLに接続できないときの対処方法

b_kazu

総合スコア26

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Sinatra

Sinatraは、Rubyで作られた オープンソースのWebアプリケーションフレームワークです。

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2017/01/12 03:15

sinatraアプリをつくっています。
activerecordをつかってpostgresqlを操作したいのですが、下記のようなエラーがでます。

ActiveRecord::StatementInvalid at /

PG::UndefinedTable: ERROR: relation "tablenames" does not exist

エラー表示にある"tablenames"というのは今回接続を求めているデータベースとは違うデータベース内のテーブル名です。
指示しているデータベースと違うデータベースと接続しようとしているエラーのようなのですが、対処のしかたがわかりません。

つくったデータベースはmacのターミナルからはsql文で操作できます。
ターミナルでアプリのディレクトリへ移動して、pg_ctl -D でpostgresに接続してからsinatraを立ち上げています。

環境
mac os10
sinatra 1.4.7
activerecord 5.0.0.1
postgresql 9.5.3
データベース名: infodb
テーブル名: infodbs

対処方法がわかるかたがいましたら教えてください。
よろしくお願いいたします。

コードは以下です。

ruby

1--main.rb-- 2 3require 'sinatra' 4require 'sinatra/reloader' 5require 'active_record' 6 7ActiveRecord::Base.establish_connection( 8 adapter: 'postgresql', 9 host: "", 10 username: 'myname', 11 password: "", 12 database: 'infodb' 13) 14 15class Info < ActiveRecord::Base 16end 17 18get '/' do 19 @infos = Info.where("column_name like ?", "%検索ワード%") 20 erb :info 21end

erb

1--info.erb(views)-- 2 3<!DOCTYPE html> 4<html lang="ja"> 5<head> 6 <meta charset="utf-8"> 7</head> 8<body> 9 <% @infos.each do |info| %> 10 <ul> 11 <li><%= "#{info['column_name']}" %></li> 12 </ul> 13 <% end %> 14</body> 15</html>

気になる質問をクリップする

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

tablenamesにどういう経路でアクセスしようとしているかがわかりませんでした。
自信ありませんがtablenamesのモデルを作成しモデル内でestablish_connectionを定義すれば動くかもしれません。

投稿2017/01/12 04:25

hn1

総合スコア303

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

b_kazu

2017/01/12 05:30

回答ありがとうございます。ただ、今回アクセスしたいのはtablenamesではなく、infodbsです。infodbsにアクセスするよに書いたコードなのに、"tablenames" does not exist --> tablenamesは存在しません、というエラーになぜなるのかを知りたいのが質問の主旨です。 モデルについてはRailsでつかう仕組みのようですが調べてみます。
hn1

2017/01/12 05:48 編集

直接tablenamesを指定している箇所がないなら、どこかで間接的にアクセスしているんでしょうか Infoテーブルの中でtablenamesテーブルを外部キーで参照していたりとか・・・ > モデルについてはRailsでつかう仕組みのようですが調べてみます。 以下のような感じで考えてました class Tablename < ActiveRecord::Base endestablish_connection( ・・・ ) end
b_kazu

2017/01/12 23:33

解決しました。 class名をInfodb(データベース名の一文字目を大文字) あと、テーブル名をデータベース名+s になおしたら接続できました。 (質問文のテーブル名と実際のテーブル名が違っていました。) 最終的に、 データベース名:infodb テーブル名:infodbs class Infodb < ActiveRecord::Base end と名前を統一したら接続できました。 いろいろとありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問