define_table不会在数据库中创建表

时间:2014-10-30 09:35:51

标签: python web2py

我以推荐的方式运行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 个答案:

答案 0 :(得分:1)

只需删除migrate_enabled=False即可关闭迁移,从而阻止创建或修改数据库表。也没有必要明确设置auto_import=False,因为它已经是默认值。

如果上述方法没有帮助,那么web2py可能之前成功创建了这样一个表,并且在没有web2py知道的情况下删除了它。如果应用程序的/databases文件夹包含名称为* _auth_user.table的文件,请删除该文件并重试。

如果这不是问题,请检查/databases/sql.log文件并确认web2py尝试创建该表。最有可能的是,系统配置中的某些内容阻止了表的创建。

更新:在您的编辑中,您似乎正在使用web2py应用程序之外的DAL。因为您没有为folder构造函数指定DAL()参数,所以它会将* .table迁移文件保存在当前工作目录中,并且不会创建sql.log文件。在这种情况下,最好为迁移和日志文件创建一个单独的文件夹:

DAL('postgres://user:pass@localhost:5432/mydb', folder='/path/to/folder')

在这种情况下,它会将所有* .table迁移文件和sql.log文件保存在指定的文件夹中。