SQLite创建DB/文件,而不是打开现有的



我试图在python中打开SQLite数据库,使用SQLite共享库(libsqlite3.0)。dylib在macOS上)。(我使用这个库而不是sqlite3模块,因为我需要使用sqlite3_update_hook函数,该函数在python模块中没有暴露。)

组织树如下:

MyProject/
SRC/
- ProductionSQLite.py
- CONST.py
DATA/
- imdb-tiny.db 
- Some bigger .db files

文件名为"imdb-tiny.db"是一个SQLite数据库。文件constys .py只包含其他脚本的常量。

我试图从python脚本打开这个数据库,使用以下代码:

from ctypes import CDLL, byref
from sys import stderr
DATA_PATH = "DATA/"
DLL_NAME = "libsqlite3.0.dylib" # {"Linux": "libsqlite3.so", "MacOS": "libsqlite3.0.dylib", "Windows": "winsqlite3.dll"}
SQLITE3 = CDLL(DLL_NAME) # Load sqlite3 shared library
if __name__=="__main__":
# Pointeur vers la DB (plus précisément, vers un objet qui la représente)
db = c_void_p()
# Liaison avec la base SQLite
return_number:int = SQLITE3.sqlite3_open(f"{DATA_PATH}imdb-tiny.db", byref(db))
if return_number != 0:
# Erreur à l'ouverture de la DB
print(f"Echec de l'ouverture de la DB: erreur {return_number}.", file=stderr)
print(f"Documentation des erreurs: https://www.sqlite.org/capi3ref.html#SQLITE_ABORT", file=stderr)
exit(-1)
# Exécution de requêtes sur la base SQLite
query = b'CREATE TABLE foo (id INT, name VARCHAR(255))'
err = c_char_p() # Create a variable to hold error messages
SQLITE3.sqlite3_exec(db, query, None, None, byref(err))
if err: print(err.value, file=stderr)

脚本运行没有任何错误,但它的行为不像预期的那样。它创建了一个新的文件/数据库,以数据库名称的第一个字母命名(在这里,它将是"D"因为它是字符串"DATA/imdb-tiny.db")的第一个字符。创建文件的位置取决于我是从VSCode扩展(MyProject文件夹)或终端(与终端相同的位置)执行的。你知道为什么会发生这种情况以及如何修复它吗?

这里的问题是您没有将字符串编码为sqlite3_open函数调用的utf-8字节列表。D是字符串的第一个字符。

通过显式地将字符串编码为字节列表,您将能够打开正确的文件:

SQLITE3.sqlite3_open(f"{DATA_PATH}imdb-tiny.db".encode('utf-8'), byref(db))

潜在的问题是python没有提示作为参数传递给函数的数据类型,但无论如何,您都需要确保参数是以正确格式进行二进制编码的,以供函数使用。

最新更新