2017-04-18 4 views
0

私はSequel::Model.DBを使用して自分のDBとやりとりしますが、何らかの理由でDB構造がDBコンソールなどで変更されました。SequelとのDB接続をリフレッシュする方法

この方法:

Sequel::Model.db.schema('table_name') 

はまだ私が推測する最初の接続からキャッシュされた古いDBを返します。

どのようにしてキャッシュをリセットすることができますか、理想的には、各リクエストで実際のDB接続を確認できますか?

私は、新しい接続を毎回使用してみました:

def db 
    @db ||= Sequel.connect(Sequel::Model.db.opts) 
end 

しかし、予想通り、私は最終的に、このエラーを得た:

Sequel::DatabaseConnectionError - PG::ConnectionBad: FATAL: sorry, too many clients already 
+0

コードの例がないと、広範な提案を放棄する以上のことはありません。 ( "[mcve]"とリンク先のページを参照してください。) –

+0

答えがあります。それを受け入れた(ジェレミーは私が尋ねたものに正確に答えた)。私は何をもっと読まなければならないのですか?あなたの不安に感謝します。 – okliv

答えて

3

あなたは、データベースの構造を変更するべきではありませんSequelが動作している間は互換性のない方法です。この問題を解決する最も簡単な方法は、データベーススキーマを変更した後にプロセスを再起動するだけです。Sequelは新しいデータベース構造を選択します。

実際にプロセスを再起動せずにこの処理を実行する場合は、キャッシュされたスキーマ(@db.instance_variable_get(:@schemas).clear)を削除し、すべてのモデルクラス(各Sequel :: ModelのModelClass.dataset = ModelClass.dataset)のデータセットをリセットすることができます。ただし、必ずしも同じ結果になるわけではありません。なぜなら、列を削除すると、古い列名にはまだメソッドが定義されているからです。

+0

ハックのおかげで、ジェレミー。私はそれがうまく設計されたソリューションのように見えますが、私の場合、実際には、アプリケーションが実行されている間、db構造をフリーズする方法はありません。だから私は時々接続を実現する必要があります。多分プロセスを再開するのも解決策ですが、間違っているのはスキーマクリアよりもはるかに遅く/重いのですか? (実際には、今のところ、このような可能性は、プログラマブルな方法でアプリケーションコントローラから行うことはできませんでした) – okliv

+1

@oklivなぜDB構造を「フリーズ」する方法がないのでしょうか?データベースの構造はリアルタイムで?これは、あなたが完全にこれのユースケースを説明することができない限り、設計上の欠陥かもしれないようです。 – engineersmnky

+0

@engineersmnky、これはDB構造を管理するための "admin"アプリだから) – okliv

関連する問題