【问题标题】:define_table does not create table in databasedefine_table 不在数据库中创建表
【发布时间】:2014-12-26 06:48:26
【问题描述】:

我正在以推荐的方式运行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 数据库中。这是什么意思?

【问题讨论】:

    标签: python web2py


    【解决方案1】:

    只需删除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 文件保存在指定文件夹中。

    【讨论】:

    • 感谢 Anthony,这对进一步诊断我的问题很有帮助。
    • 关于这个的一个问题:它会关闭迁移并因此阻止创建或修改数据库表migrate_enabled=False 是否也阻止创建?在我的理解中,创造不是迁移。
    • 术语“迁移”不仅指对单个表的更改(例如添加新列),还指对数据库架构的任何更改(包括添加新表)。这在documentation 中有描述,我认为这与该术语在其他框架中的使用方式是一致的。迁移只是从一个版本的数据库架构更改为另一个版本——创建新表后,您现在拥有一个新的数据库架构(即,您已“迁移”到新版本的架构)。
    猜你喜欢
    • 2013-05-14
    • 2022-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-28
    • 1970-01-01
    • 2019-06-16
    相关资源
    最近更新 更多