你得到的行为我不明白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']
这是预期的行为吗?如果是这样,如何在语法错误后删除/创建表?感谢
答案 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)