我想导入CSV文件导入AUTH_USER表不重复的用户名,所以我创建表的用户
db.define_table('user',
Field('username',unique=True,length=255),
Field('password'))
导入CSV文件导入用户则比较表用户和AUTH_USER,插入一些记录,在用户表中,而不是在AUTH_USER表。
db.executesql('insert into auth_user(username,password) select username,password from user where not exists(select * from auth_user where (auth_user.username=user.username))')
这是行不通的,所以我不知道该如何选择插入到元组AUTH_USER表。 谢谢
默认情况下,当插入到密码散列auth_user
表(经由与密码字段相关联的形式的验证)。 所以,你不想做的明文密码标准的SQL INSERT INTO表(不仅是因为在登录不安全的,但后续尝试将失败Auth
期待散列密码)。
已经散列做批量插入时做最简单的方法是通过记录回路并插入每一个使用.validate_and_insert
方法。 这将运行所有的现场验证(这将导致被散列密码),并且未通过验证的任何记录,也根本无法插入(因此,例如,重复的用户名不会被插入,因为这将无法通过验证)。
for user in db(db.user).select():
db.auth_user.validate_and_insert(username=user.username, password=user.password)
虽然确认过程中会自动拒绝任何重复的用户名,如果你希望有很多重复的,想提高效率,你可以先选择只能从非重复的user
表:
users = db(~db.user.username.belongs(db()._select(db.auth_user.username))).select()
for user in users:
db.auth_user.validate_and_insert(username=user.username, password=user.password)
另外请注意,默认情况下, auth_user
表确实需要在价值观first_name
, last_name
和email
字段(并且需要为一些有效的电子邮件地址Auth
功能,如重置密码)。 因此,您应该计划,以填补在这些领域为好,或以其他方式设置其requires
的属性,以None
这样验证不会失败。 例如:
db.auth_user.first_name.requires = None
另一种选择是定义一个定制auth_user
表。
尝试cghange你的子查询的使用:
insert into auth_user(username,password) select username,password from user
where UserName not in (select username from auth_user where
(auth_user.username=user.username))'