我以推荐的方式运行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数据库中。这是什么意思?
答案 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文件保存在指定的文件夹中。