Ruby: SQLite3:: BusyException: la base de données est verrouillée:
rencontré ce message d'erreur alors que le développement de ce soir: SQLite3::BusyException: database is locked:
j'ai deux modèles:
- Podcasts ont beaucoup de Pistes de Les pistes
- appartiennent aux Podcasts. Les fichiers de Podcast
- sont hébergés sur mixcloud .
pour créer un Podcast:
- l'utilisateur soumet une url pour un podcast sur mixcloud
- application rails, l'accaparement des flux json associés avec l'url
- json est utilisé pour définir des attributs (titre, image etc) sur le nouvel objet Podcast
j'essaie d'obtenir mon application rails pour profiter du fait que le flux json détaille également les noms (et les artistes) des pistes qui appartiennent à ce Podcast.
j'ai pensé que la méthode avant validation suivante créerait automatiquement toutes les pistes associées chaque fois que nous créons un nouveau Podcast.
class Podcast < ActiveRecord::Base
attr_accessible :mixcloud_url, :lots, :of, :other, :attrs
has_many :tracks
before_validation :create_tracks
def create_tracks
json = Hashie::Mash.new HTTParty.get(self.json_url)
json.sections.each do |section|
if section.section_type=="track"
Track.create(:name=>section.track.name, :podcast_id=>self.id)
end
end
end
end
comment je peux contourner ça? Il semble que les rails (ou sqlite3) ne m'aiment pas en créant de nouvelles instances d'un modèle associé de cette façon. Sinon, comment puis-je faire cela? Je soupçonne qu'il s'agit autant d'un problème de rails qu'un problème de sqlite3. Je peux poster plus de code si ça va aider.
15 réponses
pour toute autre personne rencontrant ce problème avec le verrouillage SQLite dans le développement quand une console Rails est ouverte, essayez ceci:
exécutez juste ce qui suit:
ActiveRecord::Base.connection.execute("BEGIN TRANSACTION; END;")
pour moi de toute façon, il semble effacer toute transaction que la console gardait et libère la base de données.
C'est surtout un problème pour moi quand je lance delayed_job, qui semble échouer à fermer la transaction assez souvent.
SQLite n'est pas vraiment censé être utilisé pour l'accès simultané qui est le problème que vous rencontrez ici. Vous pouvez essayer d'augmenter le délai dans votre fichier database.yml
qui peut être une solution de contournement pour vous dans ce cas. Cependant, je vous recommande de passer à une autre base de données qui supporte plusieurs connexions comme MySQL ou PgSQL.
pour moi...la question que j'avais était qu'il semblait que la Console de Rails que j'avais ouvert pendant un certain temps était de verrouiller une connexion avec SQLite.
donc une fois que j'ai quitté cette console, et redémarré mon serveur web (fin) ça a fonctionné parfaitement.
j'ai essayé la suggestion de @trisweb mais ça n'a pas marché pour moi.
j'ai eu le même "ActiveRecord::StatementInvalid: SQLite3::BusyException: base de données est verrouillée: INSÉRER DANS les "utilisateurs" ("created_at", "email", "nom", "password_digest", "updated_at") VALUES (?, ?, ?, ?, ?)" question. J'ai essayé toutes les solutions trouvées dans Google et j'ai échoué. Le problème a été résolu pour moi quand j'ai fermé mon navigateur de base de données SQLite.
assurez-vous que vous n'avez pas 2 gardes ou plusieurs consoles en marche. Si vous voulez être sûr de voir désespérément la réponse "Pas de nom" ci-dessus.
vous pouvez également essayer d'augmenter la piscine:
par exemple: modifier la section test de votre configuration / base de données.yml comme ci-dessous
test:
adapter: sqlite3
database: db/test.sqlite3
pool: 50
timeout: 5000
probablement vous avez une console de Rails ouverte sur une autre bash, si c'est le cas vous devez la fermer (ctrl+D).
en fait pour moi, j'ai trouvé que tuer des rails aide à résoudre ce problème.
utilisez "ps aux | grep rails"
pour trouver le numéro d'identification du processus en cours des rails.
puis utiliser
"kill -9 [rails-pid]"
pour tuer les processus.
alors ça marchera
il est fort probable qu'il ne s'agisse pas d'un code ferroviaire. En utilisant en même temps la console avec l'option sandbox ( rails console --sandbox
), rend le problème systématique avec SQLite, puisque la console est fondamentalement en attente de quitter pour tout faire reculer.
la solution ci-dessus de @trisweb ne fonctionnera pas dans ce cas, mais quitter la console le fera.
Oui c'est une vieille question et il y a déjà beaucoup de réponses ici. Mais aucun d'entre eux travaillaient pour moi, le sens qu'il m'a fallu du temps pour enfin comprendre le problème. j'ai trouvé ce qui a fonctionné et je le partagerai au cas où ce serait ce qui pourrait causer le problème pour vous aussi.
j'utilisais le navigateur SQLITE (son navigateur de base de données GUI). Je vais l'appeler " GUI " ici (pour éviter toute confusion avec le mot navigateur étant votre localhost::8000 navigateur chrome ou quoi que ce soit.
http://sqlitebrowser.org/
je surveillais ce qui était écrit dans la base de données et j'ai ouvert l'interface graphique pendant que mon application rails fonctionnait dans mon navigateur chrome. Je rafraîchirais L'interface graphique pour voir si elle ajoutait les données comme je m'y attendais.
comme une question de débogage j'avais décidé de supprimer une rangée de L'interface graphique SQLite pour que je puisse voir si mon application réagirait comme il se doit, la rangée a disparu.
comme il s'avère, le navigateur SQLite ne supprime pas réellement la ligne (provoquant la confusion de mon côté quant à savoir pourquoi mon application agissait comme si la ligne était encore là, même si elle était visuellement manquante sur l'interface graphique). Quoi qu'il en soit, après 30 minutes de frustration, j'ai fermé L'interface graphique de SQLite et j'ai reçu un avis me demandant si je voulais enregistrer les modifications que j'avais apportées à la base de données. j'ai naïvement cliqué sur "Non" et a fermé l'application.
apparemment ce qui se passe est que l'interface graphique a ensuite verrouillé la base de données parce qu'il y avait des lignes dans ma base de données qui avaient été en quelque sorte" soft-deleted " sans s'engager à la supprimer. Ainsi, l'interface graphique (faute d'un meilleur terme) tenait la base de données dans le flou.
cela explique pourquoi a) mon application n'agissait pas comme si la rangée était manquante, parce qu'elle n'avait pas encore été supprimée, et B) explique pourquoi la base de données est verrouillée. Il attendait toujours que je fasse les suppressions.
donc pour résoudre le problème, j'ai tout simplement ouvert l'interface graphique une fois de plus et supprimé la même ligne, puis fermé l'interface graphique et cette fois j'ai cliqué sur" Oui "en demandant de sauvegarder les modifications dans la base de données . Il a sauvé la suppression et déverrouillé la base de données et maintenant mon application fonctionne!
j'espère que cela aidera quelqu'un d'autre qui pourrait avoir le même problème, mais utilisait L'interface graphique du navigateur SQLite. C'est peut-être ce qui bloque votre base de données.
j'ai eu le même problème. Pour ceux avec le navigateur de base de données SQLite. Je n'avais pas besoin de fermer le navigateur de base de données SQLite. Je n'avais qu'à cliquer sur "Écrire les Changements". Elle est mise en évidence et ne doit pas l'être.
SQLite a des problèmes avec la concurrence. J'ai changé de sqlite, Postgresql et le problème a disparu
cela se produit lorsque vous apportez des modifications manuellement directement dans le navigateur SQLite DB (comme supprimer une ligne ou changer la valeur d'une colonne) et que vous oubliez de sauvegarder ces modifications. Toute modification doit être sauvegardée ( ctrl + s
). Si elle n'est pas sauvegardée, SQLite verrouille la base de données jusqu'à ce que vous sauvegardiez ces modifications.
j'ai fait la même chose et mon problème a été résolu!
mon problème est: j'ai ouvert un programme de gestion de base de données appelé "DB Browser for SQlite". Fermé ce programme de gestion de base de données, et Problème résolu.
J'utilisais navigateur DB pour SQLite et console rails simultanément. Fermer le DB Browser for SQLite
a réglé le problème pour moi.
essayez de redémarrer le serveur ou la fermeture de toute console de rails de roulement, a travaillé pour moi