Sqlite3, OperationalError: no se puede abrir el archivo de base de datos

Question: Why can't I open the database?


Info: I'm working on a project using sqlite3 database. I wrote a test program that runs and passes it the database:

/tmp/cer/could.db

The unit test program can make the db without any problem. But, when I actually use the program passing the same location to it, i got below error:

OperationalError: unable to open database file

I've tried doing it with:

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

In three cases, I got the above error. The most frustrating part has to be the fact that the unittest can do it just fine, but the actual program can't.

Any clues as to what on earth is going on?

preguntado el 09 de enero de 11 a las 00:01

Is that the full path? Are you sure you aren't passing the path via environment variables or ~ or some other short form? -

Does the /tmp/cer/ directory exist? -

@chrisaycook: yes. I'm not. @thkala: it does. -

19 Respuestas

Primary diagnosis: SQLite is unable to open that file for some reason.

Checking the obvious reasons why, and in approximate order that I recommend checking:

  • Is the program running on the same machine as you're testing it?
  • Is it running as you (or at least the same user as you're testing it as)?
  • Is the disk containing /tmp full? (You're on Unix, so use df /tmp to find out.)
  • ¿Tiene el /tmp/cer directory have “odd” permissions? (SQLite needs to be able to create additional files in it in order to handle things like the commit log.)
  • Is the unit test code still using that database? (Concurrent opens Médica possible with a modern-enough SQLite and when in the right filesystem — though /tmp is virtually always on the right sort of FS so it's probably not that — but it's still not recommended.)
  • Is the development code verdaderamente trying to write to that database, or is something “clever” catching you out and causing it to try to open something else? (I've been caught out by this in my code in the past; don't think it can't happen to you…)
  • Are you using the same version of the SQLite library in the unit tests and the production code?

If you're not on the same machine, it's quite possible that the production system doesn't have a /tmp/cer directory. Obvious to fix that first. Similarly, if you're on the same machine but running as different users, you're likely to have permissions/ownership problems. Disk space is another serious gotcha, but less likely. I don't think it's the last three, but they're worth checking if the more obvious deployment problems are sorted. If it's none of the above, you've hit an exotic problem and will have to report much more info (it might even be a bug in SQLite, but knowing the developers of it, I believe that to be quite unlikely).

Respondido el 09 de enero de 11 a las 03:01

yes. yes. no. not that I know of. It shouldn't be. no. the database is made by the same system, the only difference is that UTFile.py calls it instead of cSystem.py. yes, I'm using the built in version SQLite that comes with python. - Narcolapser

found my problem. the strings were not completely identical. There was a slight difference because of my config file. the config file was leaving a line break in my path so i was trying to open: '/tmp/cer/\ncloud.db' there was my problem. but this was a very very good answer. thank you kindly! - Narcolapser

Thank you! I had this problem, and it was indeed lacking write permissions to the directory by the web server's user, even though the file had write permissions for that user. - arantius

I had the same problem. Although the database has 777 permission, the directory it was in was 755, changing that to 777 as well fix the problem. Your tip about the "odd permissions" help me. - uncletall

I'm having the same issue but in a docker container, how should I go about this? - Mwibutsa Floribert

Esto funcionó para mí:

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

Note: Double slashes in the full path

Usar python v2.7 on Win 7 enterprise and Win Xp Pro

Espero que esto ayude a alguien.

Respondido 31 Oct 12, 23:10

on ubuntu, the backslashes also helped: create_engine("sqlite:///data\db_folder\example.db") - Zephro

On unix I got that error when using the ~ shortcut for the user directory. Changing it to /home/user Resuelto el error.

Respondido 11 Jul 17, 19:07

Same here although I would love to know why this makes sense. Is sqlite not allowing ~ as home reference? - Sergio Lucero

One reason might be running the code in a path that doesn't match with your specified path for the database. For example if in your code you have:

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

And you run the code inside the folder_A or other places that doesn't have a folder_A it will raise such error. The reason is that SQLite will create the database file if it doesn't exist not the folder.

One other way for getting around this problem might be wrapping your connecting command in a try-except expression and creating the directory if it raises sqlite3.OperationalError.

from os import mkdir import sqlite3 as 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')

respondido 05 nov., 17:17

Thanks! This is what I was looking for. Moreover, isn't the else redundant here since the conn object always be created whenever the clause is triggered? Also, would it be more idiomatic to move the statement in the else cláusula a la except part and add a finally es conn.close()? - Kshitij Saraogi

Yes thanks for note. The ‘else’ part should actually be ‘finally’. Also there is no need to close the connection right after creating one. - kasravnd

this was exactly what I ran into and I should have caught it... - Jeff Bluemel

I faced the same problem on Windows 7. My database name was test y me sale el error:

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

Reemplacé test es test.db and and all went smooth.

Respondido el 14 de diciembre de 13 a las 19:12

In my case, the solution was to use an absolute path, to find an existing file:

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)

I don't know why this fix works: the path only contained ASCII characters and no spaces. Still it made the difference.

For reference: Windows 7, Python 3.6.5 (64-bit).

I was not able to reproduce the issue on another machine (also Windows 7, Python 3.6.4 64-bit), so I have no idea why this fix works.

Respondido 16 Abr '18, 00:04

I had this same problem, and it turned out that my notebook was operating out of a folder adjacent to my database (e.g. source>notebooks and source>db>database.db). The absolute path solved it. - alofgran

This is definitely a permissions issue. If someone is getting this error on linux, make sure you're running the command with sudo as the file most likely is owned by root. Hope that helps!

Respondido 03 Oct 18, 21:10

Use the fully classified name of database file

Use- /home/ankit/Desktop/DS/Week-7-MachineLearning/Week-7-MachineLearning/soccer/database.sqlite

instead-

respondido 29 nov., 18:15

1) Verify your database path, check in your settings.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':''

some times there wont be NAME': os.path.join(BASE_DIR, 'project.db'),

2)Be sure for the permission and ownership to destination folder

it worked for me,

respondido 15 mar '19, 06:03

If this happens randomly after correctly being able to access your database (and no settings have changed), it could be a result of a corrupted database.

I got this error after trying to write to my database from two processes at the same time and it must have corrupted my db.sqlite3 file.

Mi solución fue revert back to a previous commit before the corruption happened.

Respondido 30 ago 19, 18:08

Run into the error on Windows, added assert os.path.exists, double checked the path, run the script as administrator, nothing helped.

Turns out if you add your folders to the Windows Defender's Ransomware Protection, you can no longer use other programs to write there unless you add these programs to the Controlled Folder Access' whitelist.

Solution - check if your folder has been added to the Windows Defender's Ransomware Protection and remove it for faster fix.

Respondido el 19 de Septiembre de 19 a las 12:09

I found running powershell as administrator makes it just work. - Harry Moreno

Ran into this issue while trying to create an index on a perfectly valid database. Turns out it will throw this error (in addition to other reasons described here) if the sqlite temp_store_directory variable/directory is unwritable.

Solution: change temp_store_directory es c.execute(f'PRAGMA temp_store_directory = "{writable_directory}"'). Note that this pragma is being deprecated and I am not yet sure what the replacement will be.

respondido 22 nov., 19:20

in my case, i tried creating the sqlite db in /tmp folder and from all the slashes i missed a single slash

En lugar de sqlite:///tmp/mydb.sqlite -> sqlite:////tmp/mydb.sqlite ...

Respondido 05 Oct 20, 15:10

Mirar: docs.sqlalchemy.org/en/13/core/engines.html#sqlite, relative path is 3 slashes: 'sqlite:///foo.db' and absolute path is 4 slashes: 'sqlite:////absolute/path/to/foo.db' ... - Ricky Levi

Make sure you are not editing the settings.py file while trying to run syncdb, you will get the same error!!!

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

respondido 24 nov., 11:01

The only thing you need to do is create the folder (as it doesn't exist already), only the database file will be created by the program. This really worked for me!

respondido 29 mar '18, 16:03

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)


for clearer full path if you didn't get it clear

Respondido el 25 de junio de 18 a las 02:06

My reason was very foolish. I had dropped the manage.py onto the terminal so it was running using the full path. And I had changed the name of the folder of the project. So now, the program was unable to find the file with the previous data and hence the error.

Make sure you restart the software in such cases.

Respondido el 14 de Septiembre de 19 a las 20:09

For any one who has a problem with airflow linked to this issue.

In my case, I've initialized airflow in /root/airflow and run its scheduler as raíz. Usé el run_as_user parámetro para personificar esta web user while running task instances. However airflow was always failing to trigger my DAG with the following errors in logs:

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

I also found once I triggered a DAG manually, a new airflow resource directory was automatically created under /home/web. I'm not clear about this behavior, but I make it work by removing the entire airflow resources from /root, reinitializing airflow database under /home/web and running the scheduler as web debajo:

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

If you want to try this approach, I may need to backup your data before doing anything.

respondido 16 nov., 19:01

had the same problem but top answer is too long for me so I suggest to open another shell window type cd #enter e intenta de nuevo

Respondido 27 Jul 20, 23:07

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.