подключение sqlalchemy к MSAccess

Как я могу подключиться к MS Access с помощью SQLAlchemy? На их веб-сайте написано, что строка подключения — это access+pyodbc. Означает ли это, что мне нужно иметь pyodbc для подключения? Так как я новичок, пожалуйста, будьте осторожны.


person Jack_of_All_Trades    schedule 10.02.2012    source источник


Ответы (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")
person zzzeek    schedule 11.02.2012

В первую очередь мне нужен доступ для чтения и несколько простых запросов. Последняя версия 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))
person EB.    schedule 12.12.2012