вы должны использовать NamedTemporaryFile
вместо TemporaryFile
. по-видимому, вы работаете в MS Windows, которая не поддерживает безымянные файлы, поэтому эти два одинаковы и, следовательно, вы не заметите никакой разницы
, которая говорит, что вы не должны использовать *TemporaryFile
вообще, так как они создают и открывают файл, чтобы защитить вас от одновременных процессов, запутывающих вас. файл предположительно заблокирован и, следовательно, когда sqlite пытается открыть тот же файл, он терпит неудачу
, есть несколько альтернатив в зависимости от того, что вы хотите сделать:
- используйте
tempfile.mktemp()
, чтобы получитьимя временного файла, обратите внимание, что это устарело по причине - , используйте
tempfile.mkdtemp()
, чтобы получить имя временного каталога, в котором вы можете создать базу данных. здесь меньше проблем с безопасностью, поэтому предпочтительно - использовать
tempfile.TemporaryDirectory()
, который создаст каталог и автоматически удалит его, когда он выйдет из области видимости. это может быть хорошо / плохо для вашего варианта использования - создать базу данных в памяти, выполнив
sqlite3.connect(':memory:')
. опять же, в зависимости от того, действительно ли это временная база данных, это может или не может быть тем, что вы хотите
, чтобы объяснить, что происходило раньше, что вы на самом деле делали, когда говорили, что это "работает", похожеto:
import sqlite3, tempfile
a = tempfile.TemporaryFile()
b = a.name
del a
conn1 = sqlite3.connect(b)
это будет:
- создать объект
TemporaryFile
, который создаст пустой временный файл на диске и откроет его для чтения / записи - получить имя только что созданного временного файла
- удалить объект
TemporaryFile
из области, что также приведет к удалению связанного файла - использовать временное имя для созданиябаза данных
причина сбоя, когда вы держали TemporaryFile
, заключалась в том, что файл никогда не закрывался и не удалялся. sqlite3 это не понравилось, и поэтому ему не удалось
объяснение слишком длинное, надеюсь, оно имеет смысл!