簡體   English   中英

如何在SQLAlchemy中加載SQLite3擴展?

[英]How to load a SQLite3 extension in SQLAlchemy?

我使用SQLAlchemy在我的應用程序中構建了一個SQLite擴展(即.so庫)。 這是一個Flask應用程序,但我不認為Flask在這里發揮作用。

擴展可以從CLI加載,似乎工作:

$ sqlite3

SQLite version 3.20.1 2017-08-24 16:21:36
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> .load ./libSqliteIcu.so

但我需要在我的應用程序中執行此操作。 Python文檔中有一個例子:

import sqlite3

con = sqlite3.connect(":memory:")

# enable extension loading
con.enable_load_extension(True)

# Load the fulltext search extension
con.execute("select load_extension('./fts3.so')")

但在我的應用程序中,我必須使用db訪問數據庫:

db = flask_sqlalchemy.SQLAlchemy()

我可以將最后一個語句重寫為:

db.session.execute('select load_extension("./libsqliteicu.so")')

但它因“未授權”錯誤而失敗。

如何調用enable_load_extension()或以其他方式成功加載擴展?

經過一些搜索和測試,並根據各種來源,這對我有用。 這就是我所能說的代碼質量。 我發布它只是因為它可能會幫助某人。 如果您發現問題,請隨時發表評論。

from sqlalchemy.event import listen

# initialization routine
# app: this Flask application
# db: the database, see the question 
db_collate = 'sk_SK.UTF-8'   # Slovak language for example
def load_extension(dbapi_conn, unused):
    dbapi_conn.enable_load_extension(True)
    dbapi_conn.load_extension('/path/to/libSqliteIcu.so')
    dbapi_conn.enable_load_extension(False)
    dbapi_conn.execute("SELECT icu_load_collation(?, 'ICU_EXT_1')", (db_collate,))
with app.app_context():
    listen(db.engine, 'connect', load_extension)

和用法:

from sqlalchemy.sql.expression import collate

...query.order_by(collate(Table.column, 'ICU_EXT_1'))

名稱ICU_EXT_1完全是任意的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM