默认SqliteDatabase已经包含许多 SQLite 特定的特性:
使用 SQLite 的一般说明。
使用 PRAGMA 语句配置 SQLite。
用户定义的函数、聚合和排序规则。
交易的锁定模式。
其中playhouse.sqlite_ext包括更多 SQLite 功能,包括:
全文搜索
JSON 扩展集成
闭包扩展支持
LSM1 扩展支持
用户定义的表函数
支持使用备份 API 进行在线备份:backup_to_file()
BLOB API 支持,用于高效的二进制数据存储。
其他助手,包括bloomfilter等。
要开始使用本文档中描述的功能,您需要使用模块中的SqliteExtDatabase类playhouse.sqlite_ext 。此外,某些功能需要playhouse._sqlite_extC 扩展 - 这些功能将在文档中注明。
实例化一个SqliteExtDatabase:
from playhouse.sqlite_ext import SqliteExtDatabase
db = SqliteExtDatabase('my_app.db', pragmas=(
('cache_size', -1024 * 64), # 64MB page-cache.
('journal_mode', 'wal'), # Use WAL-mode (you should always use this!).
('foreign_keys', 1))) # Enforce foreign-key constraints.
class SqliteExtDatabase(database[, pragmas=None[,timeout=5[, c_extensions=None[, rank_functions=True[, hash_functions=False[, regexp_function=False[,bloomfilter=False]]]]]]])
参数:
class CSqliteExtDatabase(database[, pragmas=None[,timeout=5[, c_extensions=None[, rank_functions=True[, hash_functions=False[, regexp_function=False[,bloomfilter=False[, replace_busy_handler=False]]]]]]]])
参数:
pragmas (list) – A list of 2-tuples containing pragma key and value to set every time a connection is opened.
timeout – Set the busy-timeout on the SQLite driver (in seconds).
c_extensions (bool) – Declare that C extension speedups must/must-not be used. If set to True and the extension module is not available, will raise an ImproperlyConfigured exception.
rank_functions (bool) – Make search result ranking functions available.
hash_functions (bool) – Make hashing functions available (md5, sha1, etc).
regexp_function (bool) – Make the REGEXP function available.
bloomfilter (bool) – Make the bloom filter available.
replace_busy_handler (bool) – Use a smarter busy-handler implementation.
on_commit( fn )
注册在当前连接上提交事务时要执行的回调。回调不接受任何参数,返回值被忽略。
但是,如果回调引发 a ValueError,事务将被中止并回滚。
例子:
db = CSqliteExtDatabase(':memory:')
@db.on_commit
def on_commit():
logger.info('COMMITing changes')
on_rollback( fn )
注册在当前连接上回滚事务时要执行的回调。回调不接受任何参数,返回值被忽略。
例子:
@db.on_rollback
def on_rollback():
logger.info('Rolling back changes')
on_update( fn )
注册一个要在database写入时执行的回调(通过UPDATE、INSERT或DELETE查询)。回调应接受以下参数:
例子:
db = CSqliteExtDatabase(':memory:')
@db.on_update
def on_update(query_type, db, table, rowid):
# e.g. INSERT row 3 into table users.
logger.info('%s row %s into table %s', query_type, rowid, table)
changes()
返回当前打开的事务中修改的行数。
autocommit
返回一个布尔值的属性,指示是否启用了自动提交。默认情况下,该值将True在事务(或atomic()块)内除外。
例子:
>>> db = CSqliteExtDatabase(':memory:')
>>> db.autocommit
True
>>> with db.atomic():
... print(db.autocommit)
...
False
>>> db.autocommit
True
backup(destination[, pages=None , name=None , progress=None])
参数:
master = CSqliteExtDatabase('master.db')
replica = CSqliteExtDatabase('replica.db')
# Backup the contents of master to replica.
master.backup(replica)
backup_to_file(filename[, pages, name, progress])
参数:
例子:
db = CSqliteExtDatabase('app.db')
def nightly_backup():
filename = 'backup-%s.db' % (datetime.date.today())
db.backup_to_file(filename)
blob_open(表,列,rowid[,只读=False])
参数:
返回类型: Blob
请参阅Blob和ZeroBlob了解更多信息。
例子:
class Image(Model):
filename = TextField()
data = BlobField()
buf_size = 1024 * 1024 * 8 # Allocate 8MB for storing file.
rowid = Image.insert({Image.filename: 'thefile.jpg',
Image.data: ZeroBlob(buf_size)}).execute()
# Open the blob, returning a file-like object.
blob = db.blob_open('image', 'data', rowid)
# Write some data to the blob.
blob.write(image_data)
img_size = blob.tell()
# Read the data back out of the blob.
blob.seek(0)
image_data = blob.read(img_size)
class RowIDField
与 SQLite 字段对应的主键rowid字段。有关详细信息,请参阅有关rowid 表的 SQLite 文档。
例子:
class Note(Model):
rowid = RowIDField() # Will be primary key.
content = TextField()
timestamp = TimestampField()
class DocIDField
RowIDField的子类,用于专门使用约定docid作为主键的虚拟表。据我所知,这只适用于使用 FTS3 和 FTS4 全文搜索扩展的表格。
注意
在 FTS3 和 FTS4 中,“docid”只是“rowid”的别名。为了减少混淆,最好总是使用RowIDField 并且永远不要使用DocIDField.
class NoteIndex(FTSModel):
docid = DocIDField() # "docid" is used as an alias for "rowid".
content = SearchField()
class Meta:
database = db
class AutoIncrementField
默认情况下,SQLite 可以在删除行后重用主键值。为确保主键始终单调递增,无论删除如何,您都应该使用AutoIncrementField. 此功能的性能成本很小。有关更多信息,请参阅关于autoincrement的 SQLite 文档。