1

問題の核心が私が今知っていることについては、以下の「更新」を参照してください。

Railsアプリケーションとのインターフェースを作成したいレガシーDerbyデータベースがあります。
私はRVMを使用しているので、次の手順を実行しました。

1. rvm install jruby (installed 1.6.7.2)

2. rvm use jruby

3. gem install rails 

4. rails new myapp

5. add "gem 'activerecord-jdbcderby-adapter'" to Gemfile of new rails app

6. bundle

7. copied my derby db folder (named 'perm') under db in the rails app

8. changed database.yml as follows:

  development:
    adapter: jdbcderby
    database: db/perm

次に、モデルファイルを作成し、set_table_nameを使用してテーブル名の1つに設定しました。レールを実行すると、テーブルが存在しないという例外が発生します。

私がするときもコンソールで

ActiveRecord::Base.connection.tables

返される唯一のテーブルは「schema_migrations」です。

この正確なコピーに接続し、SquirrelSQLを使用してすべてのテーブルを表示できるため、データベースに問題はないことを私は知っています。また、コンソールを開いたときに、コンソールの実行中にSquirrelSQLを使用して同じインスタンスに接続したり、その逆を行ったりすることができないため、railsアプリは何らかの方法で接続しています。

アクティブレコードがテーブルを表示しない理由について誰かが何か提案がありますか?

アップデート:

この問題は、ダービーがテーブルを同じファイル内の複数の「スキーマ」に「編成」する方法と関係があります。Railsから(つまり、移行を使用して)新しいテーブルを作成すると、テーブルは「SA」スキーマになります。私のレガシーテーブルはすべて「APP」スキーマにあります(おそらくそれらを移動することはできますが、それを回避できれば移動したくありません...他のアプリは壊れます)。したがって、この方法でレールからデータベースにアクセスすると、「SA」スキーマのみが存在するようになります。Railsに「App」スキーマを「使用」するように指示するにはどうすればよいですか(初期にテーブル名の前に付けようとしましたが、機能しませんでした)。

それに応じて質問のタイトルを変更しました。

更新#2:

どうやらjdbcderbygemは「スキーマ」設定をサポートしているようです。推測では、database.ymlを次のように変更してみました。

development:
  adapter: jdbcderby
  database: db/perm
  schema: app (also tried APP)

コンソールでActiveRecord::Base.connection.tablesを実行するときにアプリ(またはAPP)スキーマ設定がある場合、アプリスキーマからテーブルのリストを取得します(リストはスキーマ名なしですべて小文字のテーブル名で表示されます)。

しかし、私はまだテーブルにアクセスするのに問題があります。既存のテーブルにモデルファイルを作成してアクセスしようとすると、「スキーマ'SA'が存在しません」というJDBCErrorが発生します。さまざまなset_table_name呼び出しを試しましたが、成功しませんでした。

私の知る限り、私のデータベースには何も異常はありません。しかし、これを行う方法についての情報はどこにもありません。RailsでレガシーDerbyデータベースを使用しようとしたことがあるのは私だけですか?

4

1 に答える 1

0

データベース名 'db/perm' は、現在の作業ディレクトリに対して相対的に解釈されています。これはおそらく、あなたが考えているディレクトリではありません。(1) ハードディスクでファイル 'derby.log' を検索します。このファイルは、おそらく Rails アプリの実際の現在の作業ディレクトリに作成されます。または、(2) derby データベースへの絶対ファイル パスを指定します。相対ファイル パス。

問題がスキーマである場合、Derby は SET SCHEMA ステートメントをサポートします: http://db.apache.org/derby/docs/10.8/ref/rrefsqlj32268.html

スキーマを明示的に設定しない場合、接続に使用するユーザー名がデフォルトになるため、目的のユーザー名でログインすることでスキーマを間接的に設定することもできます。

于 2012-07-22T18:19:59.527 に答える