While using sqlite3 from C/C++ I learned that it has a open-in-read-only mode option, which is very handy to avoid accidental data-corruption. Is there such a thing in the Python binding?
            Asked
            
        
        
            Active
            
        
            Viewed 2.8k times
        
    49
            
            
        - 
                    Possible duplicate of: http://stackoverflow.com/questions/4239606/sqlite3-read-only-on-a-file-system-that-doesnt-support-locking – Chris Apr 18 '12 at 08:53
 - 
                    1@Chris Thanks, I will redact an answer just to save some work to future people with the same question. – dsign Apr 18 '12 at 09:04
 - 
                    possible duplicate of [force python to forego native sqlite3 and use the (installed) latest sqlite3 version](http://stackoverflow.com/questions/1545479/force-python-to-forego-native-sqlite3-and-use-the-installed-latest-sqlite3-ver) – Jakob Bowyer Apr 18 '12 at 09:48
 
4 Answers
75
            As of Python 3.4.0 you can open the database in read only mode with the following:
db = sqlite3.connect('file:/path/to/database?mode=ro', uri=True)
Also see the documentation.
        anthonyryan1
        
- 4,867
 - 2
 - 34
 - 27
 
- 
                    3for a relative path, no leading `/` character is needed, e.g.: `file:folder/db.sqlite3?mode=ro` – philshem Jan 06 '22 at 16:35
 
17
            
            
        Workaround for Python 2.x:
fd = os.open(filename, os.O_RDONLY)
c = sqlite3.connect('/dev/fd/%d' % fd)
os.close(fd)
Not posix, but available on Linux, OS/X and most modern unixes.
        OrenT
        
- 179
 - 1
 - 3
 
13
            
            
        Somewhat related, note that you can enable/disable modifications dynamically with a pragma:
pragma query_only = ON;   -- disable changes
pragma query_only = OFF;  -- enable changes
        P-Gn
        
- 23,115
 - 9
 - 87
 - 104
 
5
            
            
        As by the link given by @Chris, no. But there is another wrapper for sqlite3, which is less PEP 249-compliant and that wraps sqlite3 more tightly, assimilating new features of the engine: https://github.com/rogerbinns/apsw. That wrapper does support opening the database in read-only mode, plus other niceties.