Как я могу подключиться к MS Access с помощью SQLAlchemy? На их веб-сайте написано, что строка подключения — это access+pyodbc. Означает ли это, что мне нужно иметь pyodbc для подключения? Так как я новичок, пожалуйста, будьте осторожны.
подключение sqlalchemy к MSAccess
Ответы (2)
Теоретически это должно быть через create_engine("access:///some_odbc_dsn"), но серверная часть Access вообще не использовалась с SQLAlchemy 0.5, и неясно, насколько хорошо она работала тогда (вот почему он отмечен как «разрабатываемый» на странице http://docs.sqlalchemy.org/en/latest/core/engines.html#supported-databases — «разработка» означает, что «разрабатываемая версия диалекта существует, но ее еще нельзя использовать»). Просто не хватает интереса/добровольцев, чтобы поддерживать этот диалект прямо сейчас. (когда/если это так, вы увидите его на http://docs.sqlalchemy.org/en/latest/dialects/access.html).
Лучше всего для Access прямо сейчас было бы экспортировать данные в файл базы данных SQLite (или, конечно, в какую-либо другую базу данных, хотя SQLite по крайней мере основан на файлах), а затем использовать это.
Обновление, сентябрь 2019 г.:
Возрожден диалект доступа к sqlalchemy. Подробности здесь.
Пример использования:
engine = create_engine("access+pyodbc://@some_odbc_dsn")
В первую очередь мне нужен доступ для чтения и несколько простых запросов. Последняя версия sqlalchemy имеет (сломанные) серверные модули доступа, но она не зарегистрирована как точка входа.
Требовалось несколько исправлений, но это сработало для меня:
def fixup_access():
import sqlalchemy.dialects.access.base
class FixedAccessDialect(sqlalchemy.dialects.access.base.AccessDialect):
def _check_unicode_returns(self, connection):
return True
def do_execute(self, cursor, statement, params, context=None, **kwargs):
if params == {}:
params = ()
super(sqlalchemy.dialects.access.base.AccessDialect, self).do_execute(cursor, statement, params, **kwargs)
class SomeObject(object):
pass
fixed_dialect_mod = SomeObject
fixed_dialect_mod.dialect = FixedAccessDialect
sqlalchemy.dialects.access.fix = fixed_dialect_mod
fixup_access()
ENGINE = sqlalchemy.create_engine('access+fix://admin@/%s'%(db_location))