2017-04-18 1 views
0

J'utilise Sequel::Model.DB pour interagir avec ma base de données, mais pour une raison quelconque, la structure de base de données a été modifiée, par exemple, via la console DB.Comment rafraîchir la connexion DB avec Sequel

Cette méthode:

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

retourne encore l'ancien DB, mis en cache à partir de la première connexion, je suppose.

Comment puis-je réinitialiser ce cache ou, idéalement, assurer la connexion DB réelle à chaque requête?

J'ai essayé d'utiliser une nouvelle connexion à chaque fois:

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

mais on pouvait s'y attendre, je me suis finalement cette erreur:

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

Sans exemples de votre code, il est difficile de faire plus que jeter des suggestions générales. (Lisez "[mcve]" et la page liée.) –

+0

J'ai une réponse. l'a accepté (Jeremy a répondu exactement ce que j'ai demandé). Que dois-je lire de plus? merci beaucoup pour votre anxiété. – okliv

Répondre

3

Vous ne devriez pas modifier la structure de la base de données une manière incompatible pendant que Sequel est en cours d'exécution. Le moyen le plus simple de résoudre ce problème consiste simplement à redémarrer le processus après avoir modifié le schéma de la base de données, et Sequel récupérera la nouvelle structure de la base de données. Si vous voulez vraiment essayer de le faire sans redémarrer le processus, vous pouvez supprimer les schémas en cache (@db.instance_variable_get(:@schemas).clear) et réinitialiser l'ensemble de données pour toutes les classes de modèle (ModelClass.dataset = ModelClass.dataset pour chaque modèle Sequel :: Model). Cependant, cela n'aboutit pas nécessairement à la même chose, puisque si vous supprimez une colonne, l'ancien nom de la colonne aura toujours une méthode définie pour cela.

+0

merci pour le hack, Jeremy. Je me rends compte qu'il ressemble à une solution pas bien conçue, mais dans mon cas, il n'y a vraiment aucun moyen de geler une structure de DB alors que l'application est en cours d'exécution. donc j'ai besoin d'actualiser une connexion de temps en temps. peut-être redémarrer le processus - est une solution aussi, mais ai-je tort, il est beaucoup plus lent/plus lourd que la compensation de schéma? (et, en fait, je ne considérais pas cette possibilité, pour l'instant, de le faire par programme à partir d'un contrôleur d'application, par exemple) – okliv

+1

@okliv pourquoi n'y a-t-il aucun moyen de "geler" la structure DB? la structure de la base de données en temps réel? Cela semble être un défaut de conception, sauf si vous pouvez expliquer en détail un cas d'utilisation pour cela. – engineersmnky

+0

@engineersmnky, parce que c'est l'application "admin" pour gérer la structure db =) – okliv