error changing data — attempt to write a readonly database
(1) By McVitas on 2021-03-19 12:43:29
[link]
[source]
Hello,
so I am using SQLite on a Windows Server 2012 for some time already. Now after I patched the OS and rebooted, I can’t seem to edit tables via SQLiteBrowser because of this error message!
Funny thing is that I can copy the .db file to another location and open it in SQLiteBrowser and it works just fine! But if I copy the file back to where it always was I get this error!
This already happened to me once and I found there was a .db-journal file present, probably because I have interrupted PHP script in the middle of something. Deleting that file fixed it back then, but today there is no such file, so what’s wrong and how do I fix it?
(2.1) By TripeHound on 2021-03-19 14:13:51 edited from 2.0
in reply to 1
[source]
Given that it works in one location, and not in another, including what those locations are in a problem report would be (a) helpful, and (b) (I would have hoped) obvious
Best guess is the original location is somewhere that Windows (now) regards as «protected» in some measure (e.g. «C:Program Files
«) and the recent update has imposed stricter permissions on that area (or, perhaps, has removed looser permissions you might have given it in the past).
Also, it should be noted that SQLiteBrowser is a 3rd-party product. If your investigations into «protected locations» doesn’t lead anywhere, try accessing the database using the SQLite CLI command-line program to eliminate anything SQLiteBrowser might be doing.
(3) By McVitas on 2021-03-19 15:05:47
in reply to 2.1
[link]
[source]
this is really weird, because it’s not in some system folder. But you are right permissions seem to be a problem!
It works when I run SQLiteBrowser elevated «as administrator»
But I am logged on as user which is member of administrators group so that’s confusing a bit…
I just forgot I need to do this since I opened it last time
(4) By Simon Slavin (slavin) on 2021-03-19 16:17:02
in reply to 3
[link]
[source]
That’s a definite diagnostic. The problem isn’t in SQLite, it’s part of the permissions settings of your setup.
Take a detailed look at the permissions on the folder where you keep your database files, the database file, and journal or .shm file SQLite has created, the application doing the accessing, and anything else you think might be appropriate.
For testing, create a new special local account with minimal privileges and see whether everything works.
(5) By anonymous on 2021-09-16 13:20:28
in reply to 1
[link]
[source]
I am using ubuntu 18.08. OperationalError at /admin/login/ I am getting an attempt to write a readonly database error. to database -rwxrwxrwx 1 root privilege . Can you help me find the solution?
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Sqlite3 database created in one program but other program trying to write gets read only
Hi I have a sqlite3 database which is working from one of the programs but when i try to write to it from another program i get the following error message.
«Error: SQLITE_READONLY: attempt to write a readonly database»
How to i change the permissions for the database to allow other writes to the file?
i am trying to use node red to send i new value to the database code i use in node red is
INSERT INTO heater (timer) VALUES (?), (1.5)
is it i need to change the file location permissions?
file location is
/home/pi/heater_run.db
i have tried «sudo chmod -R ugo+rw- /home/pi/heater_run.db»
but this has not worked
-
scruss
- Posts: 5237
- Joined: Sat Jun 09, 2012 12:25 pm
- Location: Toronto, ON
Re: Sqlite3 database created in one program but other program trying to write gets read only
Mon Sep 14, 2020 10:14 pm
Is this a permissions thing? Was the db created using sudo, and a regular user is trying to update it?
Also, you can only have one process writing to a SQLite database at any one time. You can have multiple processes with the db open, but without some extensions enabled you can only have one writer at a time.
‘Remember the Golden Rule of Selling: “Do not resort to violence.”’ — McGlashan.
Pronouns: he/him
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Mon Sep 14, 2020 10:24 pm
scruss wrote: ↑
Mon Sep 14, 2020 10:14 pm
Is this a permissions thing? Was the db created using sudo, and a regular user is trying to update it?Also, you can only have one process writing to a SQLite database at any one time. You can have multiple processes with the db open, but without some extensions enabled you can only have one writer at a time.
the database was not created with sudo and i am sure it is a permission thing but i am not sure how to correct this i have tried using sudo chmod and chmod to change the file permission but so far it has not made any difference. the only thing i have not tried is rebooting the raspberry pi yet,
i am only trying to access the file 1 at a time so its not that the file is open by the original program at the time..
-
DougieLawson
- Posts: 42330
- Joined: Sun Jun 16, 2013 11:19 pm
- Location: A small cave in deepest darkest Basingstoke, UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Mon Sep 14, 2020 10:45 pm
It’s probably the two simultaneous writers problem.
sqlite3 doesn’t have good row locking. You can have as many readers as you need. You can have ONE writer.
All of my sqlite3 programs use
as the first SQL statement I execute in a reader program.
The fix for a read only database is
echo ‘.dump’ | sqlite3 mysqlitedata.db | sqlite3 replacementdata.db
then mv mysqlitedata.db oldsqlitedata.db; mv replacementdata.db mysqlitedata.db
Languages using left-hand whitespace for syntax are ridiculous
DMs sent on https://twitter.com/DougieLawson or LinkedIn will be answered next month.
Fake doctors — are all on my foes list.
The use of crystal balls and mind reading is prohibited.
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 12:18 am
DougieLawson wrote: ↑
Mon Sep 14, 2020 10:45 pm
It’s probably the two simultaneous writers problem.sqlite3 doesn’t have good row locking. You can have as many readers as you need. You can have ONE writer.
All of my sqlite3 programs use
as the first SQL statement I execute in a reader program.
The fix for a read only database is
echo ‘.dump’ | sqlite3 mysqlitedata.db | sqlite3 replacementdata.db
then mv mysqlitedata.db oldsqlitedata.db; mv replacementdata.db mysqlitedata.db
Hi Dougie
i have stopped the original program from running to ensure there is no conflict with the other program trying to write to the database. this still came up with the same error saying trying to write to a read only Database. the database will only be writen to about every 3 hours and i only want to be able to write from the second program every few months.
i am interested in the fix you have shown but i am a little lost how to do the steps you have said. I am happy to create a new database as its not got much information in it at this stage. so would it be best to create the new database from within a terminal window instead of a python script?
-
cleverca22
- Posts: 7020
- Joined: Sat Aug 18, 2012 2:33 pm
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 1:18 am
sqlite wants to create 1 or 2 more files in the same dir as the db during normal operation
so the permissions to the directory also matter, and can cause problems even if you can write to the main file
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 7:18 am
cleverca22 wrote: ↑
Tue Sep 15, 2020 1:18 am
sqlite wants to create 1 or 2 more files in the same dir as the db during normal operation
so the permissions to the directory also matter, and can cause problems even if you can write to the main file
Thanks guess that makes this more of a problem for me as i use the home/pi folder. is there a way to change the permissions for this directory?
this also explains why i have seen a similar issue with csv files in the past..
-
DougieLawson
- Posts: 42330
- Joined: Sun Jun 16, 2013 11:19 pm
- Location: A small cave in deepest darkest Basingstoke, UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 8:16 am
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 12:18 am
i am interested in the fix you have shown but i am a little lost how to do the steps you have said. I am happy to create a new database as its not got much information in it at this stage. so would it be best to create the new database from within a terminal window instead of a python script?
Do it in a lxterminal window. Type in my blue commands but with your database file name.
Languages using left-hand whitespace for syntax are ridiculous
DMs sent on https://twitter.com/DougieLawson or LinkedIn will be answered next month.
Fake doctors — are all on my foes list.
The use of crystal balls and mind reading is prohibited.
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 9:14 am
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 12:18 am
DougieLawson wrote: ↑
Mon Sep 14, 2020 10:45 pm
It’s probably the two simultaneous writers problem.sqlite3 doesn’t have good row locking. You can have as many readers as you need. You can have ONE writer.
All of my sqlite3 programs use
as the first SQL statement I execute in a reader program.
The fix for a read only database is
echo ‘.dump’ | sqlite3 mysqlitedata.db | sqlite3 replacementdata.db
then mv mysqlitedata.db oldsqlitedata.db; mv replacementdata.db mysqlitedata.dbHi Dougie
i have stopped the original program from running to ensure there is no conflict with the other program trying to write to the database. this still came up with the same error saying trying to write to a read only Database. the database will only be writen to about every 3 hours and i only want to be able to write from the second program every few months.i am interested in the fix you have shown but i am a little lost how to do the steps you have said. I am happy to create a new database as its not got much information in it at this stage. so would it be best to create the new database from within a terminal window instead of a python script?
i have now checked the permissions using ls -l for the home/pi folder and it was only read only so i have changed the permissions so that it is read and write for anyone. this still gives the message that its a read only database. i then changed the permissions for the whole home/pi directory so it also was read and write for anyone. But still it say attempting to write to a read only database.
so now not sure if its using some other locations for the database files?
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 9:31 am
DougieLawson wrote: ↑
Tue Sep 15, 2020 8:16 am
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 12:18 am
i am interested in the fix you have shown but i am a little lost how to do the steps you have said. I am happy to create a new database as its not got much information in it at this stage. so would it be best to create the new database from within a terminal window instead of a python script?Do it in a lxterminal window. Type in my blue commands but with your database file name.
Thanks Dougle
sorry to be a pain but i am a bit slow when it comes to this
my database is «heater_run.db » and its in the /home/pi directory so when i start the terminal i am in the right directory to use the commands you showed but i am not sure hoe to change the code so i dont mess up.
echo ‘.dump’ | sqlite3 mysqlitedata.db | sqlite3 replacementdata.db
i think i just need to change it to
echo ‘.dump’ | sqlite3 heater_run.db | sqlite3 replacementdata.db
mv mysqlitedata.db oldsqlitedata.db; mv replacementdata.db mysqlitedata.db
then change the 2nd command this is where i get lost
can you please explain ?
-
scruss
- Posts: 5237
- Joined: Sat Jun 09, 2012 12:25 pm
- Location: Toronto, ON
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 1:31 pm
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 9:14 am
… i have now checked the permissions using ls -l for the home/pi folder and it was only read only …
Something’s not right there. How your home folder got to be read-only might suggest other problems: any other unexplained warning messages, undervoltage warnings (lightning bolt on the screen), «segmentation fault» errors? Your SD card might be corrupted.
Are you running Raspberry Pi OS, or something else? SQLite is typically one of those «it just works» things (aside from lots of database management complexity) because it keeps everything in a file owned by the user.
‘Remember the Golden Rule of Selling: “Do not resort to violence.”’ — McGlashan.
Pronouns: he/him
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 1:39 pm
scruss wrote: ↑
Tue Sep 15, 2020 1:31 pm
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 9:14 am
… i have now checked the permissions using ls -l for the home/pi folder and it was only read only …Something’s not right there. How your home folder got to be read-only might suggest other problems: any other unexplained warning messages, undervoltage warnings (lightning bolt on the screen), «segmentation fault» errors? Your SD card might be corrupted.
Are you running Raspberry Pi OS, or something else? SQLite is typically one of those «it just works» things (aside from lots of database management complexity) because it keeps everything in a file owned by the user.
I am using raspberry pi os using the ls -l it shows the file as owned by user pi and now all is set to
-rw-rw-rw- 1 pi pi 8192 Sep 14 18:53 heater_run.db
-rwxrwxrwx 1 pi pi 8192 Sep 15 13:28 Heater_run.db
i even tried to create a new database from the terminal to see if that made any difference. Now to be honest i am not sure whether the program that wrote the database is running from root or from pi
this is the ls -l print out for the file which created the original file
-rw-rw-rw- 1 pi pi 4461 Sep 15 13:20 temperature_control_v2b.py
i start the program with «sudo python3 /home/pi/Temperature_control_v2b.py»
the second program i am trying to use to write to the program is is run from with node red.
its got me beaten at the moment .
-
scruss
- Posts: 5237
- Joined: Sat Jun 09, 2012 12:25 pm
- Location: Toronto, ON
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 2:36 pm
okay, so you are using sudo: that’s why the database doesn’t belong to you, the pi user.
You don’t need to use sudo for most sensor reading tasks. You may have followed an old (< 2019) tutorial that recommended it.
‘Remember the Golden Rule of Selling: “Do not resort to violence.”’ — McGlashan.
Pronouns: he/him
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 3:17 pm
scruss wrote: ↑
Tue Sep 15, 2020 2:36 pm
okay, so you are using sudo: that’s why the database doesn’t belong to you, the pi user.You don’t need to use sudo for most sensor reading tasks. You may have followed an old (< 2019) tutorial that recommended it.
i have deleted the original database from the raspberry pi and stopped the original program running and restarted node red. I then changed the bashrc script so it now read python3 /home/pi/Heater_run.db and the new file has been created in the directory, i then restarted node red and tried to add to the database but again its the same result.
The only reason i am using to programs to write to the file is that the thing i want to control uses a mcp23017 expander and i cant get the node to work in node red. it maybe i need to just change my original python script when ever i want to reset the database file which is in my program knowledge scope.
the other solution maybe to change to MySQL but that seemed a lot harder for me to learn.
thanks for the surgestions so far.
-
GlowInTheDark
- Posts: 2331
- Joined: Sat Nov 09, 2019 12:14 pm
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 3:24 pm
Given the parameters of this problem, switching to another, much more complex DB (e.g., MySQL), will probably change a 3 week debugging project into a 6 month one.
Poster of inconvenient truths.
Back from a short, unplanned vacation. Did you miss me?
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Tue Sep 15, 2020 3:51 pm
GlowInTheDark wrote: ↑
Tue Sep 15, 2020 3:24 pm
Given the parameters of this problem, switching to another, much more complex DB (e.g., MySQL), will probably change a 3 week debugging project into a 6 month one.
[/quote/]
That’s what worries me too. as i get one thing sorted it seems i come up with another idea which starts me down another rabbit hole. A simple Aquarium controller is turning into a major project which is far beyond me. but as i don’t like admitting defeat i will keep plugging away at it.another solution maybe to send a mqtt with the new variable to change the data i need within the temperature_control_v2b.py oh well here comes version v2c.py using mqtt from node red.
-
DougieLawson
- Posts: 42330
- Joined: Sun Jun 16, 2013 11:19 pm
- Location: A small cave in deepest darkest Basingstoke, UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Wed Sep 16, 2020 4:58 pm
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 9:31 am
Thanks Dougle
sorry to be a pain but i am a bit slow when it comes to this
my database is «heater_run.db » and its in the /home/pi directory so when i start the terminal i am in the right directory to use the commands you showed but i am not sure hoe to change the code so i dont mess up.
echo ‘.dump’ | sqlite3 mysqlitedata.db | sqlite3 replacementdata.dbi think i just need to change it to
echo ‘.dump’ | sqlite3 heater_run.db | sqlite3 replacementdata.dbmv mysqlitedata.db oldsqlitedata.db; mv replacementdata.db mysqlitedata.db
then change the 2nd command this is where i get lostcan you please explain ?
‘.dump’ causes sqlite3 to dump the contents of a database to stdout.
echo … | (vertical bar is a pipe) sends the command from the echo command line to the stdin of the next process.
So we’re sending a .dump command to sqlite3 which is reading your heater_run.db.
echo ‘.dump’ | sqlite3 heater_run.db | sqlite3 replacementdata.db
We then do more «plumbing» by piping the output (stdout) of the dump command into the input (stdin) of another sqlite3 command.
That will create a new database called replacementdata.db.
The mv command is the Linux rename command.
mv heater_run.db safe_copy_of_heater_run.db
Then move the replacement to be the current database
mv replacementdata.db heater_run.db
Job done, get a cuppa and keep calm and carry on.
Languages using left-hand whitespace for syntax are ridiculous
DMs sent on https://twitter.com/DougieLawson or LinkedIn will be answered next month.
Fake doctors — are all on my foes list.
The use of crystal balls and mind reading is prohibited.
-
johnnyh20400
- Posts: 44
- Joined: Sun Jun 28, 2020 10:01 pm
- Location: Tranmere. UK
Re: Sqlite3 database created in one program but other program trying to write gets read only
Thu Sep 17, 2020 5:47 am
DougieLawson wrote: ↑
Wed Sep 16, 2020 4:58 pm
johnnyh20400 wrote: ↑
Tue Sep 15, 2020 9:31 am
Thanks Dougle
sorry to be a pain but i am a bit slow when it comes to this
my database is «heater_run.db » and its in the /home/pi directory so when i start the terminal i am in the right directory to use the commands you showed but i am not sure hoe to change the code so i dont mess up.
echo ‘.dump’ | sqlite3 mysqlitedata.db | sqlite3 replacementdata.dbi think i just need to change it to
echo ‘.dump’ | sqlite3 heater_run.db | sqlite3 replacementdata.dbmv mysqlitedata.db oldsqlitedata.db; mv replacementdata.db mysqlitedata.db
then change the 2nd command this is where i get lostcan you please explain ?
‘.dump’ causes sqlite3 to dump the contents of a database to stdout.
echo … | (vertical bar is a pipe) sends the command from the echo command line to the stdin of the next process.So we’re sending a .dump command to sqlite3 which is reading your heater_run.db.
echo ‘.dump’ | sqlite3 heater_run.db | sqlite3 replacementdata.dbWe then do more «plumbing» by piping the output (stdout) of the dump command into the input (stdin) of another sqlite3 command.
That will create a new database called replacementdata.db.The mv command is the Linux rename command.
mv heater_run.db safe_copy_of_heater_run.db
Then move the replacement to be the current database
mv replacementdata.db heater_run.dbJob done, get a cuppa and keep calm and carry on.
Thanks once again great explanation will try this later once i have time.
Return to “Troubleshooting”
Содержание
- Why do I get sqlite error, «unable to open database file»?
- 9 Answers 9
- Sqlite3, OperationalError: невозможно открыть файл базы данных
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
- Sqlite3, OperationalError: невозможно открыть файл базы данных
- ОТВЕТЫ
- Ответ 1
- Ответ 2
- Ответ 3
- Ответ 4
- Ответ 5
- Ответ 6
- Ответ 7
- Ответ 8
- Ответ 9
- Ответ 10
- Ответ 11
- Ответ 12
- Ответ 13
- Ответ 14
- Ответ 15
Why do I get sqlite error, «unable to open database file»?
Using my Django app, I’m able to read from the database just fine. When the application didn’t have permission to access the file, it gave me this error:
attempt to write a readonly database
Which made sense. So I edited the permissions on the file, so that the Apache process had write permissions. However, instead of it being able to write, I get this cryptic error:
unable to open database file
If it’s useful, here’s the entire output:
Let me know if a stack trace is necessary.
9 Answers 9
Aha, just stumbled across an article explaining this. Also Django have info on their NewbieMistakes page.
The solution is to make sure the directory containing the database file also has write access allowed to the process.
In my case, running this command fixed the problem:
My solution to this was more like so. I didn’t really want to change the ownership of this dir. (mostly because i use the pi user to do things like git)
(or whatever db you are using)
where pi is the user that i created all the files in. (yes this is a raspberry pi)
Instead of changing of permissions to www-data, i found that I only needed to change the permissions like this:
This gives group write access to the necessary files and adds the www-data user to the pi group.
Note: if you have logging, you will need to do this for the django logfile as well or apache won’t like it much.
From the Django says «Unable to Open Database File» when using SQLite3 section of the Newbie mistakes Django wiki page:
Источник
Sqlite3, OperationalError: невозможно открыть файл базы данных
Вопрос: Почему я не могу открыть базу данных?
Информация: Я работаю над проектом, цель которого не важна, но использует базу данных sqlite3. Я сделал тестовую программу, которая запускает и передает ей местоположение для создания базы данных:
а программа unit test может сделать db без проблем. Затем я фактически использую программу, передавая ей одно и то же место, и он говорит
OperationalError: невозможно открыть файл базы данных
Я пытался сделать это с пустой базой данных. с базой данных unit test, оставленной позади, и без базы данных вообще. во всех трех случаях я получаю эту ошибку. Самая неприятная часть должна состоять в том, что unit test может сделать это просто отлично, но фактическая программа не может.
Любые подсказки о том, что происходит на Земле?
ОТВЕТЫ
Ответ 1
Первичный диагноз: SQLite не может открыть этот файл по какой-либо причине.
Проверка очевидных причин, почему и в примерном порядке, который я рекомендую проверить:
- Работает ли программа на том же компьютере, что и вы ее тестируете?
- Он работает как вы (или, по крайней мере, тот же пользователь, что и вы его тестируете)?
- Полный диск, содержащий /tmp ? (Вы находитесь в Unix, поэтому используйте df /tmp , чтобы узнать.)
- Имеет ли каталог /tmp/cer «нечетные» разрешения? (SQLite должен иметь возможность создавать в нем дополнительные файлы, чтобы обрабатывать такие вещи, как журнал фиксации.)
- Является ли код unit test все еще использующим эту базу данных? (Параллельные открытия возможны с помощью современного SQLite и в правильной файловой системе, хотя /tmp практически всегда находится в правильном порядке FS, поэтому он, вероятно, не тот, но он по-прежнему не рекомендуется.)
- Является ли код разработки действительно попыткой писать в эту базу данных или что-то «умное» ловит вас и заставляет его пытаться открыть что-то еще? (Я был пойман этим в моем коде в прошлом, не думаю, что это не может случиться с вами. )
- Используете ли вы ту же версию библиотеки SQLite в модульных тестах и производственный код?
Если вы не на одной машине, вполне возможно, что в производственной системе нет каталога /tmp/cer . Очевидно, чтобы это исправить. Точно так же, если вы находитесь на одной машине, но работаете как разные пользователи, у вас могут возникнуть проблемы с правами/правами собственности. Дисковое пространство — еще одна серьезная проблема, но менее вероятно. Я не думаю, что это последние три, но стоит проверить, отсортированы ли более очевидные проблемы с развертыванием. Если это не так, вы столкнулись с экзотической проблемой и должны будете сообщить гораздо больше информации (это может быть даже ошибкой в SQLite, но, зная разработчиков, я считаю, что это маловероятно).
Ответ 2
Это сработало для меня:
Примечание. Двойные слэши в полном пути
Использование python v2.7 для Win 7 Enterprise и Win Xp Pro
Надеюсь, это поможет кому-то.
Ответ 3
В unix я получил эту ошибку при использовании ярлыка
для каталога пользователя. Изменение его на /home/user разрешило ошибку.
Ответ 4
Одной из причин может быть запуск кода в пути, который не соответствует указанному пути для базы данных. Например, если в вашем коде есть:
И вы запустите код внутри folder_A или других мест, у которых нет folder_A , он вызовет такую ошибку. Причина в том, что SQLite создаст файл базы данных, если он не существует, а не в папке.
Другим способом обойти эту проблему может быть объединение вашей команды соединения в выражении try-except и создание каталога, если оно вызывает sqlite3.OperationalError .
from os import mkdir импортировать sqlite3 как lite
Ответ 5
Убедитесь, что вы не редактируете файл settings.py при попытке запустить syncdb, вы получите ту же ошибку.
Ответ 6
Я столкнулся с той же проблемой в Windows 7. Мое имя базы данных было test , и я получил ошибку:
Я заменил test на test.db , и все прошло гладко.
Ответ 7
1) Проверьте путь к вашей базе данных, проверьте в вашем settings.py
иногда не будет NAME ‘: os.path.join(BASE_DIR,’ project.db ‘),
2) Убедитесь в разрешении и праве собственности на папку назначения
это сработало для меня,
Ответ 8
Единственное, что вам нужно сделать, это создать папку (так как она еще не существует), программа создаст только файл базы данных. Это действительно сработало для меня!
Ответ 9
В моем случае решение было использовать абсолютный путь, чтобы найти существующий файл:
Я не знаю, почему это исправление работает: путь содержал только символы ASCII и без пробелов. Тем не менее, это имело значение.
Для справки: Windows 7, Python 3.6.5 (64-разрядная версия).
Мне не удалось воспроизвести проблему на другом компьютере (также Windows 7, Python 3.6.4 64-bit), поэтому я понятия не имею, почему это исправление работает.
Ответ 10
для более ясного полного пути, если вы не поняли его
Ответ 11
Это определенно проблема с разрешениями. Если кто-то получает эту ошибку в Linux, убедитесь, что вы запускаете команду с sudo , поскольку файл, скорее всего, принадлежит пользователю root. Надеюсь, это поможет!
Ответ 12
Используйте полностью классифицированное имя файла базы данных
Ответ 13
Если это происходит случайным образом после правильного доступа к вашей базе данных (и никакие настройки не изменились), это может быть результатом поврежденной базы данных.
Я получил эту ошибку после попытки записи в базу данных из двух процессов одновременно, и она, должно быть, повредила мой файл db.sqlite3.
Мое решение состояло в том, чтобы вернуться к предыдущей фиксации до того, как произошло повреждение.
Ответ 14
Моя причина была очень глупой. Я поместил файл manage.py на терминал, чтобы он работал по полному пути. И я изменил название папки проекта. Поэтому теперь программе не удалось найти файл с предыдущими данными и, следовательно, с ошибкой.
Убедитесь, что вы перезапустите программное обеспечение в таких случаях.
Ответ 15
Запустил ошибку в Windows, добавил assert os.path.exists, дважды проверил путь, запустил скрипт от имени администратора, ничего не помогло.
Оказывается, если вы добавите свои папки в Защиту вымогателя Windows Defender, вы больше не сможете использовать для записи другие программы, если вы не добавите эти программы в белый список доступа к контролируемым папкам.
Решение — проверьте, была ли ваша папка добавлена в Защиту вымогателей Windows Defender, и удалите ее для более быстрого исправления.
Источник
Sqlite3, OperationalError: невозможно открыть файл базы данных
Вопрос: Почему я не могу открыть базу данных?
Информация: Я работаю над проектом, цель которого не важна, но использует базу данных sqlite3. Я сделал тестовую программу, которая запускает и передает ей местоположение для создания базы данных:
а программа unit test может сделать db без проблем. Затем я фактически использую программу, передавая ей одно и то же место, и он говорит
OperationalError: невозможно открыть файл базы данных
Я пытался сделать это с пустой базой данных. с базой данных unit test, оставленной позади, и без базы данных вообще. во всех трех случаях я получаю эту ошибку. Самая неприятная часть должна состоять в том, что unit test может сделать это просто отлично, но фактическая программа не может.
Любые подсказки о том, что происходит на Земле?
ОТВЕТЫ
Ответ 1
Первичный диагноз: SQLite не может открыть этот файл по какой-либо причине.
Проверка очевидных причин, почему и в примерном порядке, который я рекомендую проверить:
- Работает ли программа на том же компьютере, что и вы ее тестируете?
- Он работает как вы (или, по крайней мере, тот же пользователь, что и вы его тестируете)?
- Полный диск, содержащий /tmp ? (Вы находитесь в Unix, поэтому используйте df /tmp , чтобы узнать.)
- Имеет ли каталог /tmp/cer «нечетные» разрешения? (SQLite должен иметь возможность создавать в нем дополнительные файлы, чтобы обрабатывать такие вещи, как журнал фиксации.)
- Является ли код unit test все еще использующим эту базу данных? (Параллельные открытия возможны с помощью современного SQLite и в правильной файловой системе, хотя /tmp практически всегда находится в правильном порядке FS, поэтому он, вероятно, не тот, но он по-прежнему не рекомендуется.)
- Является ли код разработки действительно попыткой писать в эту базу данных или что-то «умное» ловит вас и заставляет его пытаться открыть что-то еще? (Я был пойман этим в моем коде в прошлом, не думаю, что это не может случиться с вами. )
- Используете ли вы ту же версию библиотеки SQLite в модульных тестах и производственный код?
Если вы не на одной машине, вполне возможно, что в производственной системе нет каталога /tmp/cer . Очевидно, чтобы это исправить. Точно так же, если вы находитесь на одной машине, но работаете как разные пользователи, у вас могут возникнуть проблемы с правами/правами собственности. Дисковое пространство — еще одна серьезная проблема, но менее вероятно. Я не думаю, что это последние три, но стоит проверить, отсортированы ли более очевидные проблемы с развертыванием. Если это не так, вы столкнулись с экзотической проблемой и должны будете сообщить гораздо больше информации (это может быть даже ошибкой в SQLite, но, зная разработчиков, я считаю, что это маловероятно).
Ответ 2
Это сработало для меня:
Примечание. Двойные слэши в полном пути
Использование python v2.7 для Win 7 Enterprise и Win Xp Pro
Надеюсь, это поможет кому-то.
Ответ 3
В unix я получил эту ошибку при использовании ярлыка
для каталога пользователя. Изменение его на /home/user разрешило ошибку.
Ответ 4
Одной из причин может быть запуск кода в пути, который не соответствует указанному пути для базы данных. Например, если в вашем коде есть:
И вы запустите код внутри folder_A или других мест, у которых нет folder_A , он вызовет такую ошибку. Причина в том, что SQLite создаст файл базы данных, если он не существует, а не в папке.
Другим способом обойти эту проблему может быть объединение вашей команды соединения в выражении try-except и создание каталога, если оно вызывает sqlite3.OperationalError .
from os import mkdir импортировать sqlite3 как lite
Ответ 5
Убедитесь, что вы не редактируете файл settings.py при попытке запустить syncdb, вы получите ту же ошибку.
Ответ 6
Я столкнулся с той же проблемой в Windows 7. Мое имя базы данных было test , и я получил ошибку:
Я заменил test на test.db , и все прошло гладко.
Ответ 7
1) Проверьте путь к вашей базе данных, проверьте в вашем settings.py
иногда не будет NAME ‘: os.path.join(BASE_DIR,’ project.db ‘),
2) Убедитесь в разрешении и праве собственности на папку назначения
это сработало для меня,
Ответ 8
Единственное, что вам нужно сделать, это создать папку (так как она еще не существует), программа создаст только файл базы данных. Это действительно сработало для меня!
Ответ 9
В моем случае решение было использовать абсолютный путь, чтобы найти существующий файл:
Я не знаю, почему это исправление работает: путь содержал только символы ASCII и без пробелов. Тем не менее, это имело значение.
Для справки: Windows 7, Python 3.6.5 (64-разрядная версия).
Мне не удалось воспроизвести проблему на другом компьютере (также Windows 7, Python 3.6.4 64-bit), поэтому я понятия не имею, почему это исправление работает.
Ответ 10
для более ясного полного пути, если вы не поняли его
Ответ 11
Это определенно проблема с разрешениями. Если кто-то получает эту ошибку в Linux, убедитесь, что вы запускаете команду с sudo , поскольку файл, скорее всего, принадлежит пользователю root. Надеюсь, это поможет!
Ответ 12
Используйте полностью классифицированное имя файла базы данных
Ответ 13
Если это происходит случайным образом после правильного доступа к вашей базе данных (и никакие настройки не изменились), это может быть результатом поврежденной базы данных.
Я получил эту ошибку после попытки записи в базу данных из двух процессов одновременно, и она, должно быть, повредила мой файл db.sqlite3.
Мое решение состояло в том, чтобы вернуться к предыдущей фиксации до того, как произошло повреждение.
Ответ 14
Моя причина была очень глупой. Я поместил файл manage.py на терминал, чтобы он работал по полному пути. И я изменил название папки проекта. Поэтому теперь программе не удалось найти файл с предыдущими данными и, следовательно, с ошибкой.
Убедитесь, что вы перезапустите программное обеспечение в таких случаях.
Ответ 15
Запустил ошибку в Windows, добавил assert os.path.exists, дважды проверил путь, запустил скрипт от имени администратора, ничего не помогло.
Оказывается, если вы добавите свои папки в Защиту вымогателя Windows Defender, вы больше не сможете использовать для записи другие программы, если вы не добавите эти программы в белый список доступа к контролируемым папкам.
Решение — проверьте, была ли ваша папка добавлена в Защиту вымогателей Windows Defender, и удалите ее для более быстрого исправления.
Источник