【Python百日进阶-Web开发-Peewee】Day276 - SQLite 扩展(一)

文章目录

  • 十二 SQLite 扩展
    • 12.1 入门
    • 12.2 APIs
      • 12.2.1 class SqliteExtDatabase
      • 12.2.2 class CSqliteExtDatabase
      • 12.2.3 class RowIDField
      • 12.2.4 class DocIDField
      • 12.2.5 class AutoIncrementField

十二 SQLite 扩展

默认SqliteDatabase已经包含许多 SQLite 特定的特性:

  • 使用 SQLite 的一般说明。

  • 使用 PRAGMA 语句配置 SQLite。

  • 用户定义的函数、聚合和排序规则。

  • 交易的锁定模式。
    其中playhouse.sqlite_ext包括更多 SQLite 功能,包括:

  • 全文搜索

  • JSON 扩展集成

  • 闭包扩展支持

  • LSM1 扩展支持

  • 用户定义的表函数

  • 支持使用备份 API 进行在线备份:backup_to_file()

  • BLOB API 支持,用于高效的二进制数据存储。

  • 其他助手,包括bloomfilter等。

12.1 入门

要开始使用本文档中描述的功能,您需要使用模块中的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.

12.2 APIs

12.2.1 class SqliteExtDatabase

class SqliteExtDatabase(database[, pragmas=None[,timeout=5[, c_extensions=None[, rank_functions=True[, hash_functions=False[, regexp_function=False[,bloomfilter=False]]]]]]])

参数:

  • pragmas ( list ) – 包含 pragma 键和值的 2 元组列表,每次打开连接时都要设置。
  • timeout – 在 SQLite 驱动程序上设置忙超时(以秒为单位)。
  • c_extensions ( bool ) – 声明必须/不得使用 C 扩展加速。如果设置为True并且扩展模块不可用,将引发ImproperlyConfigured异常。
  • rank_functions ( bool ) – 使搜索结果排名函数可用。
  • hash_functions ( bool ) – 使散列函数可用(md5、sha1 等)。
  • regexp_function ( bool ) – 使 REGEXP 函数可用。
  • bloomfilter( bool ) – 使bloomfilter可用。
    扩展SqliteDatabase和继承用于声明用户定义函数、pragma 等的方法。

12.2.2 class CSqliteExtDatabase

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 ) – 包含 pragma 键和值的 2 元组列表,每次打开连接时都要设置。
  • timeout – 在 SQLite 驱动程序上设置忙超时(以秒为单位)。
  • c_extensions ( bool ) – 声明必须/不得使用 C 扩展加速。如果设置为True并且扩展模块不可用,将引发ImproperlyConfigured异常。
  • rank_functions ( bool ) – 使搜索结果排名函数可用。
  • hash_functions ( bool ) – 使散列函数可用(md5、sha1 等)。
  • regexp_function ( bool ) – 使 REGEXP 函数可用。
  • bloomfilter( bool ) – 使bloomfilter可用。
  • replace_busy_handler ( bool ) – 使用更智能的忙处理程序实现。
    扩展SqliteExtDatabase并要求 playhouse._sqlite_ext扩展模块可用。

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查询)。回调应接受以下参数:

  • query- 查询的类型,INSERT、UPDATE或DELETE。
  • database名称 - 默认database名为main。
  • table name - 正在修改的表的名称。
  • rowid - 正在修改的行的 rowid。
    回调的返回值被忽略。

例子:

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])

参数:

  • destination ( SqliteDatabase ) – 用作备份目标的database对象。
  • pages ( int ) – 每次迭代的页数。默认值 -1 表示应在一个步骤中备份所有页面。
  • name ( str ) – 源database的名称(如果您使用 ATTACH DATABASE 加载多个database,可能会有所不同)。默认为“主要”。
  • progress - 进度回调,使用三个参数调用:剩余页数、总页数和备份是否完成。
    例子:
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])

参数:

  • filename – 存储database备份的文件名。
  • pages ( int ) – 每次迭代的页数。默认值 -1 表示应在一个步骤中备份所有页面。
  • name ( str ) – 源database的名称(如果您使用 ATTACH DATABASE 加载多个database,可能会有所不同)。默认为“主要”。
  • progress - 进度回调,使用三个参数调用:剩余页数、总页数和备份是否完成。
    将当前database备份到文件。备份的数据不是database转储,而是实际的 SQLite database文件。

例子:

db = CSqliteExtDatabase('app.db')

def nightly_backup():
    filename = 'backup-%s.db' % (datetime.date.today())
    db.backup_to_file(filename)

blob_open(表,列,rowid[,只读=False])

参数:

  • table ( str ) – 包含数据的表的名称。
  • column ( str ) – 包含数据的列的名称。
  • rowid ( int ) – 要检索的行的 ID。
  • read_only ( bool ) – 以只读方式打开 blob。
    返回:
    Blob提供对底层二进制数据的有效访问的实例。

返回类型: 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)

12.2.3 class RowIDField

class RowIDField

与 SQLite 字段对应的主键rowid字段。有关详细信息,请参阅有关rowid 表的 SQLite 文档。

例子:

class Note(Model):
    rowid = RowIDField()  # Will be primary key.
    content = TextField()
    timestamp = TimestampField()

12.2.4 class DocIDField

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

12.2.5 class AutoIncrementField

class AutoIncrementField

默认情况下,SQLite 可以在删除行后重用主键值。为确保主键始终单调递增,无论删除如何,您都应该使用AutoIncrementField. 此功能的性能成本很小。有关更多信息,请参阅关于autoincrement的 SQLite 文档。

你可能感兴趣的:(数据库,python,sqlite)