表定义上web2py DAL的奇怪行为

时间:2014-12-18 02:43:59

标签: database web2py

你得到的行为我不明白web2py

In [50]: db = DAL('sqlite://deposit/sample.sqlite')

In [51]: db.define_table('customer',Field('name','string',required=True),
     Field('nric','string',required=True),
     Field('address','string'),
     Field('phone','integer'),
     primarykey=['name'])
Out[51]: <Table customer (name,nric,address,phone)>

按预期工作。

然后我做

In [53]: db.define_table('check',
         Field('nric', db.customer.nric, required=True), 
         Field('clear','string'))

给我的消息

AttributeError: 'DAL' object has no attribute 'customer.nric'

所以认为这可能是未将customer提交到数据库

的问题

所以我做了db.commit(),然后再试一次

In [56]: db.define_table('check',Field('nric', db.customer.nric, required=True), Field('clear','string'))
  File "<string>", line unknown
SyntaxError: table already defined: check

不知道为什么..但无论如何我试着放下桌子

In [59]: db['check'].drop()

并获得以下奇怪的追溯

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-59-998297b798f5> in <module>()
----> 1 db['check'].drop()

/home/tahnoon/.dropbox-cyn/Dropbox (TIS Group)/Cynopsis/Builds/Apollo/Code Src/web2py/gluon/dal.pyc in drop(self, mode)
   9225 
   9226     def drop(self, mode=''):
-> 9227         return self._db._adapter.drop(self, mode)
   9228 
   9229     def _listify(self, fields, update=False):

/home/tahnoon/.dropbox-cyn/Dropbox (TIS Group)/Cynopsis/Builds/Apollo/Code Src/web2py/gluon/dal.pyc in drop(self, table, mode)
   1328         queries = self._drop(table, mode)
   1329         for query in queries:
-> 1330             if table._dbt:
   1331                 self.log(query + '\n', table)
   1332             self.execute(query)

/home/tahnoon/.dropbox-cyn/Dropbox (TIS Group)/Cynopsis/Builds/Apollo/Code Src/web2py/gluon/dal.pyc in __getitem__(self, key)
   9108             return self._db(self._id == key).select(limitby=(0, 1), orderby_on_limitby=False).first()
   9109         elif key:
-> 9110             return ogetattr(self, str(key))
   9111 
   9112     def __call__(self, key=DEFAULT, **kwargs):

AttributeError: 'Table' object has no attribute '_dbt'

检查表格显示

In [61]: db.tables()
Out[61]: ['customer']

这是预期的行为吗?如果是这样,如何在语法错误后删除/创建表?感谢

1 个答案:

答案 0 :(得分:2)

由于db.customer是一个键控表(即,您已经定义了primarykey属性而不是依赖于默认的自动增量整数ID字段作为主键),因此它只能被其他键控引用表。

此外,在为键控表创建引用字段时,请使用以下语法:

Field('nric', 'reference customer.nric', required=True)

但是,我不认为SQLite支持键控表(文档说只支持DB2,MS-SQL,Ingres和Informix)。无论如何,如果要在SQLite中创建新表,则没有理由使用键控表(该功能主要用于启用对缺少自动增量整数主键字段的旧数据库的访问)。

最后,删除表不会从db DAL实例中删除模型 - 相反,该操作会从数据库本身中删除表。如果要在shell会话中重新定义模型,则应使用&#34;重新定义&#34;参数:

db.define_table(..., redefine=True)