はい、Python3.4以降でやりたいことを行う方法があります。
関数を使用しsqlite3.connect()
て接続しますが、ファイルパスの代わりにURIを渡し、mode=rw
クエリ文字列に追加します。
完全に機能するコード例を次に示します。
import sqlite3
con = sqlite3.connect('file:aaa.db?mode=rw', uri=True)
これにより、現在のフォルダにある名前のファイルから既存のデータベースが開きますが、ファイルaaa.db
を開くことができないか、存在しない場合はエラーが発生します。
Traceback (most recent call last):
File "aaa.py", line 2, in <module>
con = sqlite3.connect('file:aaa.db?mode=rw', uri=True)
sqlite3.OperationalError: unable to open database file
Python sqlite.connect()のドキュメントには次のように記載されています。
uriがtrueの場合、データベースはURIとして解釈されます。これにより、オプションを指定できます。たとえば、データベースを読み取り専用モードで開くには、次を使用できます。
db = sqlite3.connect('file:path / to / database?mode = ro'、uri = True)
認識されているオプションのリストなど、この機能の詳細については、SQLiteURIのドキュメントを参照してください。
これは、 http://www.sqlite.org/c3ref/open.htmlから収集されたすべての関連するURIオプション情報の抜粋です。
モード:modeパラメータは、「ro」、「rw」、「rwc」、または「memory」のいずれかに設定できます。他の値に設定しようとするとエラーになります。「ro」を指定すると、sqlite3_open_v2()の3番目の引数にSQLITE_OPEN_READONLYフラグが設定されているかのように、データベースが読み取り専用アクセス用に開かれます。modeオプションが"rw"に設定されている場合、SQLITE_OPEN_READWRITE(SQLITE_OPEN_CREATEではない)が設定されているかのように、データベースは読み取り/書き込み(作成ではない)アクセス用に開かれます。値「rwc」は、SQLITE_OPEN_READWRITEとSQLITE_OPEN_CREATEの両方を設定することと同じです。modeオプションが"memory"に設定されている場合、ディスクからの読み取りまたは書き込みを行わない純粋なインメモリデータベースが使用されます。
sqlite3_open_v2()インターフェイスはsqlite3_open()と同様に機能しますが、新しいデータベース接続をさらに制御するために2つの追加パラメーターを受け入れる点が異なります。sqlite3_open_v2()のflagsパラメーターは、次の3つの値のいずれかを取ることができ、オプションでSQLITE_OPEN_NOMUTEX、SQLITE_OPEN_FULLMUTEX、SQLITE_OPEN_SHAREDCACHE、SQLITE_OPEN_PRIVATECACHE、および/またはSQLITE_OPEN_URIフラグと組み合わせることができます。
SQLITE_OPEN_READONLYデータベースは読み取り専用モードで開かれます。データベースがまだ存在しない場合は、エラーが返されます。
SQLITE_OPEN_READWRITEデータベースは、可能であれば読み取りと書き込みのために開かれます。または、ファイルがオペレーティングシステムによって書き込み保護されている場合にのみ読み取りのために開かれます。いずれの場合も、データベースはすでに存在している必要があります。存在しない場合は、エラーが返されます。
SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATEデータベースは読み取りと書き込みのために開かれ、データベースがまだ存在しない場合は作成されます。これは、sqlite3_open()およびsqlite3_open16()に常に使用される動作です。
便宜上、通常のパスをsqlite.connect()で使用できるURIに変換するためのPython3.4+関数もあります。
import pathlib
import urllib.parse
def _path_to_uri(path):
path = pathlib.Path(path)
if path.is_absolute():
return path.as_uri()
return 'file:' + urllib.parse.quote(path.as_posix(), safe=':/')