web2py 的 auto_import 与 define_table 对比
文档里说,如果我们“需要访问数据但不需要web2py表的属性”,可以使用auto_import,但这段代码似乎还是在正常使用表的属性。
from gluon import DAL, Field
db = DAL('sqlite://storage.sqlite', auto_import=True)
for row in db(db.person).select():
print row.name
这个表是在之前的运行中定义的。
db = DAL('sqlite://storage.sqlite', auto_import=True)
db.define_table('person',
Field('name'))
db.person[0] = {'name' : 'dave'}
db.commit()
同时使用auto_import=True和定义表会出现“无效的表名”的错误。如果两者都不使用,当我尝试访问db.table时也会出错。
1 个回答
3
当你设置 auto_import=True
时,web2py 会直接从应用程序的 "databases" 文件夹里的 *.table 文件中获取字段名称和类型。文档提到的“web2py 表属性”是指那些在模型中定义的属性(也就是用 db.define_table()
创建的),但这些属性并没有存储在数据库或 *.table 文件里,比如 "requires"、"widget"、"represent" 等等。这些属性只在 web2py 的代码中定义,所以光看 *.table 文件是无法知道的。需要注意的是,*.table 文件是用来进行数据库迁移的,因此它们只存储与数据库直接相关的元数据(也就是字段名称和类型,以及数据库级别的约束,比如 "notnull" 和 "unique")。像 "requires" 和 "represent" 这样的属性只被 web2py 使用,对数据库没有影响,所以不会记录在 *.table 文件中。