UPDATE django Version 2.1.7
Ich habe diesen Fehler sqlite3.OperationalError: database is locked
mit pytest
mit django
.
Lösung:
Wenn wir @pytest.mark.django_db
Dekorateur verwenden. Es wird ein in-memory-db
Test erstellt.
Benannt: file:memorydb_default?mode=memory&cache=shared
Wir können diesen Namen bekommen mit:
from django.db import connection
db_path = connection.settings_dict['NAME']
Gehen Sie wie folgt vor, um auf diese Datenbank zuzugreifen und sie auch zu bearbeiten:
Stellen Sie eine Verbindung zur Datenbank her:
with sqlite3.connect(db_path, uri=True) as conn:
c = conn.cursor()
Verwenden Sie uri=True
diese Option, um die Datenträgerdatei anzugeben, die die zu öffnende SQLite-Datenbank ist.
Um den Fehler zu vermeiden, aktivieren Sie Transaktionen im Dekorator:
@pytest.mark.django_db(transaction=True)
Letzte Funktion:
from django.db import connection
@pytest.mark.django_db(transaction=True)
def test_mytest():
db_path = connection.settings_dict['NAME']
with sqlite3.connect(db_path, uri=True) as conn:
c = conn.cursor()
c.execute('my amazing query')
conn.commit()
assert ... == ....
create_engine('sqlite:///{}'.format(xxx), connect_args={'timeout': 15})