【问题标题】:Load sqlite3 extension in python3 sqlite在 python3 sqlite 中加载 sqlite3 扩展
【发布时间】:2019-02-24 06:07:46
【问题描述】:

如何正确地将 sqlite 扩展加载到 python sqlite 导入中?

操作系统:Windows 7 64 位
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 包已安装并正常工作。
我也尝试将 python 路径中的 sqlite3.dll 更新到最新版本

【问题讨论】:

  • 检查你是否安装了sqlite3 包。或者在你的windows命令提示符中使用pip install sqlite3来安装它,然后再次尝试运行代码。
  • @Arihant 是的,它已安装。所有其他命令都可以工作,只是加载扩展时出现问题。
  • 完整的&lt;&lt;path to file&gt;&gt;是什么?
  • @Shawn - 许多不同的路径。我已经尝试了所有可能的方法,包括在 python3 PATH 和 sqlite3 PATH 中使用 dll,并且只将 dll 名称放在调用中。但是,例如,我会使用这样的东西:“C:\\temp\\libsqlitefunctions.dll”

标签: python python-3.x sqlite


【解决方案1】:

这不是一个好的答案,但它提供了一种在 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)

【讨论】:

    【解决方案2】:

    libsqlitefunctions.dll 放置在全局可见的文件夹中,例如c:\WINDOWS\PATH 环境变量中的某个其他文件夹。 然后您将能够使用简单的命令加载扩展:

    con.load_extension("libsqlitefunctions.dll")
    

    【讨论】:

    • 我将sqlite3 source解压到与extension-functions.c相同的目录并使用这个命令:gcc -fPIC -lm -shared extension-functions.c -o libsqlitefunctions.dll来编译它,顺便说一句。 GCC 来自tdm-gcc 包。
    猜你喜欢
    • 2018-07-28
    • 2012-02-04
    • 1970-01-01
    • 1970-01-01
    • 2017-01-12
    • 1970-01-01
    • 2020-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多