Путаница относительно пути URI для настройки базы данных SQLite - PullRequest
2 голосов
/ 02 июня 2019

Привет, я создаю веб-приложение, используя Flask и Sqlite3.У меня были проблемы с подключением базы данных некоторое время, и я не работал, когда я писал это:

#version 1
app.config['SQLALCHEMY_DATABASE_URI'] =
'sqlite:////C:/Users/Giang/PyCharmProjects/FlaskWebBlog/FlaskWebBlog/site.db'

Python выдал мне ошибку в работе: не могу открыть базу данных, потому что я написал с 4 слешами после двоеточия.Прочитав документацию по sqlalchemy и выполнив так много испытаний, я обнаружил, что это работает:

#with 3 slashes, version 2
app.config['SQLALCHEMY_DATABASE_URI'] = 

 'sqlite:///C:/Users/Giang/PyCharmProjects/FlaskWebBlog/FlaskWebBlog/site.db'

или это с 4 слэшами, но без C:

#version 3
app.config['SQLALCHEMY_DATABASE_URI'] = 

'sqlite:////Users/Giang/PyCharmProjects/FlaskWebBlog/FlaskWebBlog/site.db'

Я запутался, потому что на основедокументация о соединительных строках: спецификация файла для базы данных SQLite берется как часть базы данных URL.Обратите внимание, что формат URL-адреса SQLAlchemy:

driver://user:pass@host/database

Это означает, что используемое имя файла начинается с символов справа от третьего слеша.Таким образом, подключение к относительному пути к файлу выглядит следующим образом:

# relative path
e = create_engine('sqlite:///path/to/database.db')

Абсолютный путь, который обозначается начиная с косой черты, означает, что вам нужно четыре косых черты:

# absolute path
e = create_engine('sqlite:////path/to/database.db')

ТАК в соответствии с этимЕсли я использую абсолютный путь, мне нужно 4 слеша, но когда я сделал это с версией 1, Python дал мне ошибки.И когда я использовал 3 слеша для абсолютного пути в версии 2, это сработало.

Так что я действительно запутался.Может кто-нибудь объяснить мне, почему?Я был бы очень признателен.Спасибо

1 Ответ

1 голос
/ 02 июня 2019

Вы правы относительно того, что компонент database читается как все символы после третьего слеша.Вот проанализированный URL-адрес версии 1

>>> import sqlalchemy.engine.url as url
>>> url.make_url('sqlite:////C:/Users/Giang/PyCharmProjects/FlaskWebBlog/FlaskWebBlog/site.db')
sqlite:////C:/Users/Giang/PyCharmProjects/FlaskWebBlog/FlaskWebBlog/site.db

>>> vars(_)
{'drivername': 'sqlite',
 'username': None,
 'password_original': None,
 'host': None,
 'port': None,
 'database': '/C:/Users/Giang/PyCharmProjects/FlaskWebBlog/FlaskWebBlog/site.db',
 'query': {}}

В Windows косая черта в начале пути нормализуется до «корневого диска текущего рабочего каталога».Используя pywin32 , мы можем вызвать GetFullPathName , чтобы просмотреть нормализованную версию пути:

>>> import os
>>> import win32file

>>> os.getcwd()
'C:\\Users\\they4kman'

>>> win32file.GetFullPathName('/C:/test')
'C:\\C:\\test'

>>> win32file.GetFullPathName('/test')
'C:\\test'

>>> win32file.GetFullPathName('C:/test')
'C:\\test'

Причина, по которой версия 1 не работает, заключается в том, чтоуказав начальную косую черту и букву диска, Windows нормализует неверный путь .(Точнее говоря, путь недопустим, потому что двоеточия не разрешены в путях Windows, кроме как в начале как спецификатор диска.)

Чтобы показать, как начальная косая черта нормализуется по-разному в зависимости от среды, давайте изменимтекущий рабочий каталог к ​​одному на другом диске и проверьте нормализованный путь:

>>> os.chdir('D:/')
>>> os.getcwd()
'D:\\'

>>> win32file.GetFullPathName('/test')
'D:\\test'

>>> win32file.GetFullPathName('C:/test')
'C:\\test'
...