define_table未在数据库中创建表

0 投票
1 回答
1978 浏览
提问于 2025-04-30 13:59

我正在按照推荐的方式运行 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 文件都会保存在你指定的文件夹里。

撰写回答