我想将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表中。 感谢
答案 0 :(得分:2)
默认情况下,密码在插入auth_user
表时会经过哈希处理(通过与密码字段关联的表单验证程序)。因此,您不希望在表中执行纯文本密码的标准SQL插入(不仅是不安全,而且后续的登录尝试将失败,因为Auth
需要散列密码)。 / p>
执行批量插入时完成散列的最简单方法是遍历记录并使用.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
表。
答案 1 :(得分:1)
尝试更改使用subselect:
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))'