在web2py中将一些元组插入表中

时间:2014-08-15 08:53:41

标签: mysql csv web2py

我想将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表中。 感谢

2 个答案:

答案 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_namelast_nameemail字段中的值(并且需要有效的电子邮件地址一些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))'