Как использовать пространственный объект с каркасом пирамиды? (или другой?) - PullRequest
0 голосов
/ 09 июля 2019

[EDIT]

Попробуйте воспроизвести это в windows. Как это сделать?

Даже если я поместил файл dll в каталог, определенный в% PATH%, или попробовал с / без полного пути, с / без расширения файла, с '//' или '\', с libspatialite-4.dll или используя извините за все комбинации, упомянутые ранее ... dbapi_conn.execute ("ВЫБЕРИТЕ load_extension ('mod_spatialite.dll')")

Например, я попробовал этот вид комбинации:

def load_spatialite(dbapi_conn, connection_record):
    dbapi_conn.load_extension('C:\\Scripts\\mod_spatialite.dll')
    # dbapi_conn.load_extension('C:\\Scripts\\libspatialite-4.dll')
    # dbapi_conn.load_extension('mod_spatialite')
    # dbapi_conn.load_extension('mod_spatialite.dll')
    # dbapi_conn.execute("SELECT load_extension('C:\\pyramid\\risc\\api\\Scripts\\mod_spatialite.dll')")
    # dbapi_conn.execute("SELECT load_extension('mod_spatialite.dll')")
    # dbapi_conn.execute("SELECT load_extension('mod_spatialite')")
    # dbapi_conn.load_extension('C:/Scripts\mod_spatialite.dll')

Простой вопрос, но сложный для меня ответ: как использовать пространственный объект с каркасом пирамиды?

Прежде всего, это мое окружение:

Windows 10:
Версия Python: 3.6.8
Локальная база данных: sqlite (для пространственного)
Удаленная база данных: postgresql

Я нахожу множество примеров, когда в параметре модуля для двигателя в create_engine задан пространственный элемент с использованием lib, например libsqlite3, mod_spatialite, pysqlite3, в моем случае я использую spatialite установить с помощью pip (определение пакета в setup.py)

Моя проблема в том, что у меня нет управления create_engine в двигателе, исходящем из настроек в ini, так что я думаю, что мне нужно пропустить настройку по файлу ini, но я не получил его. Я не нашел хорошего примера кода, использующего ту же комбинационную среду, что и моя (windows, пирамида, пространственный).

Есть настройки ini файла:

pyramid.reload_templates = true
pyramid.reload_assets = true
pyramid.debug_authorization = true
pyramid.debug_notfound = false
pyramid.debug_routematch = true
pyramid.default_locale_name = en
pyramid.includes =
    pyramid_debugtoolbar
    pyramid_tm

sqlalchemy.url = sqlite:///%(here)s/risc.sqlite

Код, где создается двигатель:

from sqlalchemy import engine_from_config
from sqlalchemy.orm import sessionmaker
from sqlalchemy.orm import configure_mappers
import zope.sqlalchemy


# run configure_mappers after defining all of the models to ensure
# all relationships can be setup
configure_mappers()


def get_engine(settings, prefix='sqlalchemy.'):
    return engine_from_config(settings, prefix)


def get_session_factory(engine):
    factory = sessionmaker()
    factory.configure(bind=engine)
    return factory


def get_tm_session(session_factory, transaction_manager):
    dbsession = session_factory()
    zope.sqlalchemy.register(dbsession, transaction_manager=transaction_manager)
    return dbsession


def includeme(config):
    settings = config.get_settings()
    settings['tm.manager_hook'] = 'pyramid_tm.explicit_manager'

    # use pyramid_tm to hook the transaction lifecycle to the request
    config.include('pyramid_tm')

    # use pyramid_retry to retry a request when transient exceptions occur
    config.include('pyramid_retry')

    session_factory = get_session_factory(get_engine(settings))
    config.registry['dbsession_factory'] = session_factory

    # make request.dbsession available for use in Pyramid
    config.add_request_method(
        # r.tm is the transaction manager used by pyramid_tm
    lambda r: get_tm_session(session_factory, r.tm),
    'dbsession',
    reify=True
)

И модуль настроек setup.py

requires = [
    'bcrypt',
    'docutils',
    'plaster_pastedeploy',
    'pyramid',
    'pyramid_debugtoolbar',
    'pyramid_retry',
    'pyramid_tm',
    'sqlalchemy',
    'transaction',
    'zope.sqlalchemy',
    'waitress',
    'sphinx',
    'flake8',
    'pyLint',
    'pg8000',
    'geoalchemy2',
    'spatialite'
]

Я почти уверен, что мне чего-то не хватает, но я не могу найти это по-своему. На этот раз я буду благодарен за небольшую подсказку.

Спасибо

...