2014-12-31 79 views
0

我为我的数据库使用MongoDB。Web2py访问控制和MongoDB

db = DAL('mongodb://localhost:27017/app') 

当我尝试注册一个新用户,我得到以下错误:

Traceback (most recent call last): 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/restricted.py", line 209, in restricted 
    exec ccode in environment 
    File "/home/ecosystem/web2py/applications/app/controllers/default.py", line 146, in <module> 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/globals.py", line 187, in <lambda> 
    self._caller = lambda f: f() 
    File "/home/ecosystem/web2py/applications/app/controllers/default.py", line 108, in user 
    return dict(form=auth()) 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/tools.py", line 1205, in __call__ 
    return getattr(self,args[0])() 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/tools.py", line 2180, in register 
    self.add_membership(group_id, form.vars.id) 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/tools.py", line 2963, in add_membership 
    record = membership(user_id = user_id,group_id = group_id) 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/dal.py", line 7656, in __call__ 
    else: 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/dal.py", line 8787, in select 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/gluon/dal.py", line 5092, in select 
    row=[] 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/pymongo/cursor.py", line 1058, in next 
    if len(self.__data) or self._refresh(): 
    File "/home/ecosystem/anaconda/lib/python2.7/site-packages/pymongo/cursor.py", line 1002, in _refresh 
    self.__uuid_subtype)) 
OverflowError: MongoDB can only handle up to 8-byte ints 

如果我看在我的数据库表,一切似乎都还好,除了几个字段。

在AUTH_USER(不知道这一个):

registration_id:"" 

在auth_event(我假设这不应该为null):

user_id:null 

什么是解决的最佳方式?如果可能的话,我想使用MongoDB来处理所有数据库事务(包括访问控制/认证)。

回答

0

更新:您可以通过升级到最新版本的Web2py来避免此问题。这现在完全支持,所以你不需要使用两个不同的数据库。


我无法直接解决此问题,但我能够创建解决方法。在db.py,我定义两个单独的数据库连接:

db = DAL('sqlite://storage.sqlite',pool_size=1,check_reserved=['all']) 
db1 = DAL('mongodb://localhost:27017/collection') 

我打电话db(最终MySQL数据库)上的所有auth功能(注册,登录,则会在检查),同时处理其他一切(包括详细成员资料)在mongo。我经常完全通过使用pymongo API绕过db1 DAL。