Sqlite3, OperationalError: kan databasebestand niet openen

Vraag: Waarom kan ik de database niet openen?


Info: ik werk aan een project met behulp van de sqlite3-database. Ik heb een testprogramma geschreven dat draait en het doorgeeft aan de database:

/tmp/cer/could.db

Het unit-testprogramma kan de dbzonder enig probleem maken. Maar toen ik het programma daadwerkelijk gebruik om dezelfde locatie eraan door te geven, kreeg ik onderstaande foutmelding:

OperationalError: kan databasebestand niet openen

Ik heb het geprobeerd met:

1) an empty database.
2) the database and the unit test left behind.
3) no database at all.

In drie gevallen kreeg ik de bovenstaande foutmelding. Het meest frustrerende moet het feit zijn dat de unittesthet prima kan, maar het eigenlijke programma niet.

Enige aanwijzingen over wat er in hemelsnaam aan de hand is?


Antwoord 1, autoriteit 100%

Primaire diagnose: SQLite kan dat bestand om de een of andere reden niet openen.

Controleren van de voor de hand liggende redenen waarom, en in de geschatte volgorde die ik aanbeveel te controleren:

  • Wordt het programma op dezelfde machine uitgevoerd als waarop u het test?
  • Wordt het uitgevoerd zoals u (of in ieder geval dezelfde gebruiker als waarmee u het test)?
  • Is de schijf met /tmpvol? (Je bent op Unix, dus gebruik df /tmpom erachter te komen.)
  • Heeft de directory /tmp/cer“oneven” machtigingen? (SQLite moet in staat zijn om er extra bestanden in te maken om zaken als het commit log te kunnen verwerken.)
  • Gebruikt de eenheidstestcode nog steeds die database? (Gelijktijdige opens zijnmogelijk met een SQLite die modern genoeg is en in het juiste bestandssysteem — hoewel /tmpvrijwel altijd op de juiste soort FS staat, dus dat is het waarschijnlijk niet — maar het wordt nog steeds niet aanbevolen.)
  • Probeert de ontwikkelcode echtnaar die database te schrijven, of is er iets “slims” dat je betrapt en ervoor zorgt dat het probeert iets anders te openen? (Ik ben hier in het verleden door betrapt in mijn code; denk niet dat het jou niet kan gebeuren…)
  • Gebruik je dezelfde versie van de SQLite-bibliotheek in de eenheidstests en de productiecode?

Als je niet op dezelfde machine werkt, is het heel goed mogelijk dat het productiesysteem geen directory /tmp/cerheeft. Duidelijk om dat eerst op te lossen. Evenzo, als u op dezelfde machine werkt maar als verschillende gebruikers werkt, heeft u waarschijnlijk problemen met machtigingen/eigendom. Schijfruimte is een andere serieuze valkuil, maar minder waarschijnlijk. Ik denk niet dat het de laatste drie zijn, maar ze zijn de moeite waard om te controleren of de meer voor de hand liggende implementatieproblemen zijn opgelost. Als het geen van bovenstaande is, heb je een exotisch probleem gepakt en zul je veel meer informatie moeten rapporteren (het kan zelfs een bug in SQLite zijn, maar als ik de ontwikkelaars ervan ken, denk ik dat dat vrij onwaarschijnlijk is).


Antwoord 2, autoriteit 46%

Dit werkte voor mij:

conn = sqlite3.connect("C:\\users\\guest\\desktop\\example.db")

Opmerking: dubbele schuine strepen in het volledige pad

Gebruik python v2.7op Win 7 Enterprise en Win Xp Pro

Ik hoop dat dit iemand helpt.


Antwoord 3, autoriteit 13%

Op Unix kreeg ik die fout bij het gebruik van de ~snelkoppeling voor de gebruikersdirectory.
Door het te wijzigen in /home/useris de fout opgelost.


4, Autoriteit 9%

Eén reden kan de code in een pad uitvoeren dat niet overeenkomt met uw opgegeven pad voor de database. Bijvoorbeeld als u in uw code hebt:

conn = lite.connect('folder_A/my_database.db')

En u voert de code in de folder_Aof andere plaatsen die geen folder_Aheeft, het zal een dergelijke fout verhogen. De reden is dat SQLITE het databasebestand zal maken als deze niet bestaat, niet de map.

Een andere manier om dit probleem op te lossen, kan uw verbindingscommando in een try-exceptexpressie inpakken en de map maken als het sqlite3.OperationalErrorrookt.

van OS import mkdir
import sqlite3 als lite

try:
    conn = lite.connect('folder_A/my_database.db')
except lite.OperationalError:
    mkdir('folder_A')
finally:
    conn = lite.connect('folder_A/my_database.db')

5

Ik heb geconfronteerd met hetzelfde probleem op Windows 7. Mijn database-naam was testen ik kreeg de foutmelding:

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file

Ik heb testvervangen door test.dbEn en alles ging glad.


6

In mijn geval was de oplossing om een ​​absoluut pad te gebruiken om een ​​bestaand bestand te vinden:

import os.path
filepath = os.path.abspath(filepath)
# Leave this out if the file doesn't exist yet
assert os.path.exists(filepath), "The file doesn't exist"
conn = sqlite3.connect(filepath)

Ik weet niet waarom deze fix werkt: het pad bevatte alleen ASCII-tekens en geen spaties. Toch maakte het het verschil.

Ter referentie: Windows 7, Python 3.6.5 (64-bits).

Ik was niet in staat om het probleem op een andere machine te reproduceren (ook Windows 7, Python 3.6.4 64-bit), dus ik heb geen idee waarom deze fix werkt.


7

Dit is absoluut een probleem met machtigingen. Als iemand deze foutmelding op Linux krijgt, zorg er dan voor dat u de opdracht uitvoert met sudozoals het bestand hoogstwaarschijnlijk eigendom is van Wortel. Hoop dat dat helpt!


8

Gebruik de volledig geclassificeerde naam van database-bestand

Gebruiks- /home/ankit/desktop/ds/week-7-machinelearning/week-7-machinelearning/soccer/database.sqlite

In plaats daarvan –


9

1) Controleer uw databasepad,
Inchecken in uw instellingen.py

DATABASES = {
    'default': {
        'CONN_MAX_AGE': 0,
        'ENGINE': 'django.db.backends.sqlite3',
        'HOST': 'localhost',
        'NAME': os.path.join(BASE_DIR, 'project.db'),
        'PASSWORD': '',
        'PORT': '',
        'USER':''

Soms zal er geen naam ‘: os.path.join (base_dir,’ project.db ‘),

2) Zorg ervoor dat voor de middelen van de toestemming en het eigendom

het werkte voor mij,


10

Loop de fout tegen op Windows, voeg assert os.path.exists toe, controleer het pad dubbel, voer het script uit als beheerder, niets hielp.

Het blijkt dat als u uw mappen toevoegt aan Windows Defender’s Ransomware Protection, u geen andere programma’s meer kunt gebruiken om daar te schrijven, tenzij u deze programma’s toevoegt aan de witte lijst van gecontroleerde maptoegang.

Oplossing – controleer of uw map is toegevoegd aan Windows Defender’s Ransomware Protection en verwijder deze voor een snellere oplossing.


Antwoord 11

Loop tegen dit probleem aan bij het maken van een index op een perfect geldige database. Het blijkt dat het deze fout genereert (naast andere redenen die hier worden beschreven) als de sqlite temp_store_directoryvariabele/directory onschrijfbaar is.

Oplossing: verander temp_store_directorymet c.execute(f'PRAGMA temp_store_directory = "{writable_directory}"'). Merk op dat deze pragma verouderd wordten dat ik nog niet zeker weet wat de vervanging zal zijn .


Antwoord 12

in mijn geval heb ik geprobeerd de sqlite db te maken in de map /tmpen van alle slashes miste ik een enkele slash

In plaats van sqlite:///tmp/mydb.sqlite-> sqlite:////tmp/mydb.sqlite


Antwoord 13

Zorg ervoor dat u het bestand settings.py niet bewerkt terwijl u syncdb probeert uit te voeren, u krijgt dezelfde foutmelding!!!

self.connection = Database.connect(**kwargs)
sqlite3.OperationalError: unable to open database file

Antwoord 14

Het enige dat u hoeft te doen is de map maken (omdat deze nog niet bestaat), alleen het databasebestand wordt door het programma gemaakt.
Dit werkte echt voor mij!


Antwoord 15

import sqlite3
connection = sqlite3.connect("d:\\pythonAPI\\data.db")
cursor = connection.cursor()
create_table = "CREATE TABLE users (id int, username text, password text)"
cursor.execute(create_table)

Voor een helderder pad als u het niet duidelijk hebt gemaakt


16

Mijn reden was erg dwaas.
Ik had de behacheld.py op de terminal laten vallen, dus het gebruikte met het volledige pad.
En ik had de naam van de map van het project gewijzigd.
Dus nu kon het programma het bestand niet vinden met de vorige gegevens en vandaar de fout.

Zorg ervoor dat u de software in dergelijke gevallen opnieuw start.


17

Voor iemand die een probleem heeft met de luchtstroom die verband houdt met dit probleem.

In mijn geval heb ik de luchtstroom geïnitialiseerd in /root/airflowen voer de planner uit als root . Ik heb de run_as_userparameter gebruikt voor impersonaat Het Web -gebruiker tijdens het uitvoeren van taakinstanties. De luchtstroom daalde echter altijd mijn dag bij de volgende fouten in logs:

sqlite3.OperationalError: unable to open database file
...
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) unable to open database file

Ik heb ook gevonden nadat ik een dag handmatig heeft geactiveerd, werd een nieuwe luchtstroommap automatisch gemaakt onder /home/web. Ik ben niet duidelijk over dit gedrag, maar ik laat het werken door de volledige luchtstroombronnen van /rootte verwijderen, het installeren van de luchtstroomdatabase met /home/weben het uitvoeren van de planner als web onder:

[root@host ~]# rm -rf airflow
[web@host ~]$ airflow initdb
[web@host ~]$ airflow scheduler -D

Als je deze aanpak wilt proberen, moet ik mogelijk een back-up van je gegevens maken voordat ik iets doe.


Antwoord 18

had hetzelfde probleem, maar het bovenste antwoord is te lang voor mij, dus ik raad aan om een ander shell-venstertype te openen
cd #enter
en probeer het opnieuw

Other episodes