49

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?

dsign
  • 12,340
  • 6
  • 59
  • 82
  • 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 Answers4

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
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.

Martin
  • 2,135
  • 8
  • 39
  • 42
dsign
  • 12,340
  • 6
  • 59
  • 82