sqliteのload_extensionsをPyramidで使う

1 min read読了の目安(約1100字

SQLiteでは数学関数や統計関数などを使うには拡張ライブラリを使う必要があるがPyramidから使うにはちょっと工夫がいった。

拡張の導入

以下のURLから extension-functions.c をダウンロードする。

gcc -fPIC -shared /home/takaki/Desktop/extension-functions.c -o libsqlitefunctions.so

sqliteを起動して以下のようにできれば拡張ライブラリはOK。

$ sqlite3 
SQLite version 3.13.0 2016-05-18 10:57:30
Enter ".help" for usage hints.
Connected to a transient in-memory database.
Use ".open FILENAME" to reopen on a persistent database.
sqlite> select load_extension('./libsqlitefunctions.so');

sqlite> select sin(3.14/2);
0.999999682931835
sqlite> 

Pyramidからの呼出

通常の雛形ファイルから以下のような変更をする。

model/__init__.py
def get_session_factory(engine):
    @event.listens_for(engine, "connect")
    def connect(dbapi_connection, connection_rec):
        dbapi_connection.enable_load_extension(True)
        dbapi_connection.execute("SELECT load_extension('{0}');".format(FULL_PATH_OF_LIB))
    factory = sessionmaker()
    factory.configure(bind=engine)
    return factory