define_table未在数据库中创建表
我正在按照推荐的方式运行 define_tables
:
db = DAL('postgres://user:XXXX@localhost:5432/mydb', migrate_enabled=False, auto_import=False, lazy_tables=True)
db.define_table('auth_user',
Field('email', unique=True),
Field('password', length=512, type='password', readable=False, label='Password'),
...)
这个过程没有报错,但在数据库中没有创建任何表。每当我尝试插入一个新用户时:
relation "auth_user" does not exist
这可能是什么情况呢?一旦表被创建(比如手动创建),应用程序就能正常工作。我使用的是postgres数据库。不管我给 lazy_tables
赋什么值,这种情况都会发生。
编辑
这是完整的测试脚本:
from gluon import DAL
from gluon import Field
db = DAL('postgres://user:pass@localhost:5432/mydb', migrate_enabled=False)
db.define_table(
'auth_user',
Field('email', type='string', unique=True),
Field('password', type='password'),
Field('registration_key', type='string', length=512, writable=False, readable=False, default=''),
Field('reset_password_key', type='string', length=512, writable=False, readable=False, default=''),
Field('registration_id', type='string', length=512, writable=False, readable=False, default=''),
)
db.commit()
print db.tables
db.auth_user.insert(email='g@b.c')
我得到以下输出:
['auth_user']
Traceback (most recent call last):
File "xxx.py", line 19, in <module>
db.auth_user.insert(email='g@b.c')
File "/tmp/web2py/gluon/dal.py", line 9293, in insert
ret = self._db._adapter.insert(self, self._listify(fields))
File "/tmp/web2py/gluon/dal.py", line 1361, in insert
raise e
psycopg2.ProgrammingError: relation "auth_user" does not exist
LINE 1: INSERT INTO auth_user(reset_password_key,registration_id,reg...
这个表似乎在“创建”了(可能是在内存中?),但实际上并没有在postgres数据库中。这个是什么意思呢?
1 个回答
2
简单来说,去掉 migrate_enabled=False
这一行,这样就会开启数据库的迁移功能,允许创建或修改数据库表。其实也不需要特别设置 auto_import=False
,因为这个本来就是默认的。
如果这样做还是不行,可能是之前 web2py 成功创建了某个表,但后来这个表被删除了,而 web2py 并不知道。如果你的应用的 /databases
文件夹里有一个名字像 *_auth_user.table 的文件,删掉这个文件再试试。
如果问题依然存在,检查一下 /databases/sql.log
文件,确认 web2py 是否尝试过创建这个表。很可能是你系统的配置有什么问题,导致表无法创建。
更新:从你的编辑来看,你是在 web2py 应用之外使用 DAL。因为你没有在 DAL()
构造函数中指定 folder
参数,所以它会把 *.table 的迁移文件保存在当前工作目录里,并且不会创建 sql.log 文件。在这种情况下,最好为迁移和日志文件创建一个单独的文件夹:
DAL('postgres://user:pass@localhost:5432/mydb', folder='/path/to/folder')
这样的话,所有的 *.table 迁移文件和 sql.log 文件都会保存在你指定的文件夹里。