2015-09-04 2 views
0

В моем приложении исключение «Адаптер не поддерживает геометрию» возникает при попытке создать поле типа «geometry()». Для моего тестового приложения, я использую БД SQLite (производство будет использовать Postgres):Исключение «Адаптер не поддерживает геометрию» при объявлении поля геометрии

db = DAL('sqlite://storage.sqlite', pool_size = 1, fake_migrate_all= False) 

В таблице БД в вопросе объявляется внутри класса, внутри модуля, и содержит несколько полей, некоторые из которые содержат данные о местоположении:

from gluon.dal import Field, geoPoint, geoLine, geoPolygon 

class Info(Base_Model): 

    def __init__(...): 

     try: 
      db.define_table('t_info', 
       ... 
       Field('f_geolocation', type='geometry()', 
        label = current.T('Geolocation')), 
       Field('f_city', type='string', 
        label = current.T('City')), 
       ... 
     except Exception as e: 
      ... 

Edit:

по предложению Энтони, я изменил DAL вызов конструктора к следующим:

db = DAL('spatialite://storage.sqlite', pool_size = 1) 

Это производит следующее сообщение об ошибке:

Traceback (most recent call last): 
    File "C:\...\web2py\gluon\restricted.py", line 227, in restricted 
    exec ccode in environment 
    File "C:/My_Stuff/Programs/web2py/applications/Proj/models/db.py", line 38, in <module> 
    db = DAL('spatialite://storage.sqlite', pool_size = 1) 
    File "C:\...\web2py\gluon\packages\dal\pydal\base.py", line 171, in __call__ 
    obj = super(MetaDAL, cls).__call__(*args, **kwargs) 
    File "C:\...\web2py\gluon\packages\dal\pydal\base.py", line 457, in __init__ 
    raise RuntimeError("Failure to connect, tried %d times:\n%s" % (attempts, tb)) 
RuntimeError: Failure to connect, tried 5 times: 
Traceback (most recent call last): 
    File "C:\...\web2py\gluon\packages\dal\pydal\base.py", line 435, in __init__ 
    self._adapter = ADAPTERS[self._dbname](**kwargs) 
    File "C:\...\web2py\gluon\packages\dal\pydal\adapters\base.py", line 53, in __call__ 
    obj = super(AdapterMeta, cls).__call__(*args, **kwargs) 
    File "C:\...\web2py\gluon\packages\dal\pydal\adapters\sqlite.py", line 169, in __init__ 
    if do_connect: self.reconnect() 
    File "C:\...\web2py\gluon\packages\dal\pydal\connection.py", line 129, in reconnect 
    self.after_connection_hook() 
    File "C:\...\web2py\gluon\packages\dal\pydal\connection.py", line 81, in after_connection_hook 
    self.after_connection() 
    File "C:\...\web2py\gluon\packages\dal\pydal\adapters\sqlite.py", line 177, in after_connection 
    self.execute(r'SELECT load_extension("%s");' % libspatialite) 
    File "C:\...\web2py\gluon\packages\dal\pydal\adapters\base.py", line 1326, in execute 
    return self.log_execute(*a, **b) 
    File "C:\...\web2py\gluon\packages\dal\pydal\adapters\base.py", line 1320, in log_execute 
    ret = self.cursor.execute(command, *a[1:], **b) 
OperationalError: The specified module could not be found. 

ответ

1

Если вы хотите использовать геометрические поля с SQLite, вы должны использовать spatialite адаптер, который делает использование SpatialLite расширения для SQLite:

db = DAL('spatialite://storage.sqlite', pool_size = 1) 

Обратите внимание, что для этого вам необходимо установить пространственную структуру.

+0

Anthony - Я попытался реализовать ваше предложение; это приводит к ошибке. Я редактировал исходный вопрос, чтобы включить полное сообщение об ошибке. Какие-нибудь идеи относительно того, что здесь происходит? – Boa

+0

Вам необходимо установить пространственный вид. – Anthony

+0

Спасибо, Энтони. Я получил пространственную установку и, похоже, работает с модулем sqlite3 python, но я все еще получаю то же сообщение об ошибке. Есть ли что-то специфическое для web2py, которое нужно сделать? Наверное, я начну новую тему. – Boa