Загрузить расширение sqlite3 в python3 sqlite - PullRequest
0 голосов
/ 20 сентября 2018

Как правильно загрузить расширение sqlite в импорт python sqlite?

os: Windows 7 64bit
sqlite3 версия: 3.14.1 64bit
python3 версия: 3.5.2 64bit

Вот мой процесс: скомпилируйте extension-functions.c в libsqlitefunctions.dll с помощью этой команды:

gcc -shared -I "C:\Software\sqlite3\sqlite-master" -o libsqlitefunctions.dll extension-functions.c

Тогда я с радостью смогу использовать эти функции в командной строке sqlite3 с помощью этой команды:

SELECT load_extension('libsqlitefunctions.dll');

Однако при попытке в скрипте python:

import sqlite3 as lite
con = lite.connect(db_file)
con.enable_load_extension(True)
con.load_extension("<<path to file>>\\libsqlitefunctions.dll")

Появляется эта ошибка:

Ошибка Указанный модуль не найден.:

Файл extension-functions.c содержит раздел COMPILE_SQLITE_EXTENSIONS_AS_LOADABLE_MODULE, и фактически он отлично загружается при использовании командной строки sqlite3

Дополнительные примечания:
Пакет Python sqlite установлен и работает правильно.
Я также пытался обновить sqlite3.dll в пути к Python до последней версии

Ответы [ 2 ]

0 голосов
/ 02 марта 2019

Поместите libsqlitefunctions.dll в папку, видимую глобально, например c:\WINDOWS\, или в какую-либо другую папку из переменной среды PATH.Тогда вы сможете загрузить расширение с помощью простой команды:

con.load_extension("libsqlitefunctions.dll")
0 голосов
/ 20 сентября 2018

Это не очень хороший ответ, но он предоставляет метод для использования расширения в python.

Вывод команд sql в файл, затем использование подпроцесса для запуска файла непосредственно в командной строке, напримеритак:

import subprocess
import uuid
import os

db_file = "trial02.db"
sqlite_functions_file = "libsqlitefunctions.dll"

sql_file = uuid.uuid4() + ".sql"
with open(sql_file, 'w') as fsql:
    fsql.write('/* auto script */\n\n')
    #load extension
    sql = "SELECT load_extension('" + sqlite_functions_file + "');"
    fsql.write(sql + '\n')
    #sql scripts
    sql = "insert into t(c) values (log(2));"
    fsql.write(sql + '\n')

args = [
    'sqlite3'
    , db_file
    , '< ', sql_file
]
print(' '.join(args))
out1 = subprocess.run(' '.join(args), shell=True)
os.remove(sql_file)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...