是的,有一种方法可以用 Python 3.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 为真,则数据库被解释为 URI。这允许您指定选项。例如,要以只读模式打开数据库,您可以使用:
db = sqlite3.connect('file:path/to/database?mode=ro', uri=True)
有关此功能的更多信息,包括已识别选项的列表,可以在SQLite URI 文档中找到。
以下是从http://www.sqlite.org/c3ref/open.html收集的所有相关 URI 选项信息的摘录:
模式:模式参数可以设置为“ro”、“rw”、“rwc”或“memory”。尝试将其设置为任何其他值是错误的。如果指定了“ro”,则打开数据库以进行只读访问,就像在 sqlite3_open_v2() 的第三个参数中设置了 SQLITE_OPEN_READONLY 标志一样。如果模式选项设置为“rw”,则打开数据库进行读写(但不是创建)访问,就像设置了 SQLITE_OPEN_READWRITE(但不是 SQLITE_OPEN_CREATE)一样。值“rwc”等效于同时设置 SQLITE_OPEN_READWRITE 和 SQLITE_OPEN_CREATE。如果模式选项设置为“内存”,则使用从不从磁盘读取或写入的纯内存数据库。
sqlite3_open_v2()接口的工作方式与sqlite3_open() 类似,只是它接受两个额外的参数来额外控制新的数据库连接。sqlite3_open_v2() 的 flags 参数可以采用以下三个值之一,可选择与 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() 始终使用的行为。
为方便起见,这里还有一个 Python 3.4+ 函数,用于将常规路径转换为 sqlite.connect() 可用的 URI:
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=':/')