使用 SQLite DB 测试我的 CLI 应用程序时出现操作错误

问题描述 投票:0回答:1

所以我想向我的 CLI 应用程序添加测试,但我正在努力用临时数据库替换我的数据库。到目前为止,我已经使用 SQLModel 进行数据库访问,但对于应用程序测试,我想使用原始 SQL 语句断言数据库值。但是,在尝试访问临时数据库时出现连接错误。

sqlite3.OperationalError: unable to open database file

到目前为止,我的计划如下:在我的测试文件中,我将 sqlite uri 替换为将其定向到临时字典中的 sqlite 数据库(使用 pytest tmp_path)。我的假设是,如果我使用 SQLModel 创建该数据库,我稍后就可以使用 sqlite3 访问它。您将在下面找到代码。 (目前,我还没有添加断言。当然,一旦数据库连接工作,就会添加断言)

另外,有没有更好的方法来替换我的实际数据库,或者我在这里所做的事情可以吗?

我的测试文件:

import sqlite3

from typer.testing import CliRunner

from projects import db
from projects.app_typer import app


def temp_db(path):
    db.sqlite_url = f"sqlite:///{path}/db.db"


runner = CliRunner()


def test_url_replacement(tmp_path):
    temp_db(tmp_path)
    assert db.sqlite_url == f"sqlite:///{tmp_path}/db.db"


def test_add_item_to_db(tmp_path):
    temp_db(tmp_path)
    result = runner.invoke(app, ["add", "public", "-n", "Project", "-p", "00-00"])
    con = sqlite3.connect(f"sqlite:///{tmp_path}/db.db")
    cur = con.cursor()
    db_entry = cur.execute("SELECT * FROM project").fetchone()
    print(db_entry)

摘自

db.py

from sqlmodel import Field, Session, SQLModel, create_engine, select


sqlite_url = "sqlite:///database.db"

engine = create_engine(sqlite_url)


def create_session_and_db():
    SQLModel.metadata.create_all(engine)

摘自

app_typer.py

import typer

app = typer.Typer(add_completion=False)


@app.callback(invoke_without_command=True, no_args_is_help=True)
def main():
    create_session_and_db()

app.add_typer(add.app, name="add", help="Add a project to the DB.")
python sqlite pytest typer
1个回答
0
投票

如果您直接连接到 sqlite DBI 驱动程序,则应直接传递文件名:

con = sqlite3.connect(f"s/{tmp_path}/db.db")

sqlite:
URL 方案由通用驱动程序使用,例如 SQLAlchemy。

© www.soinside.com 2019 - 2024. All rights reserved.