我正在使用python中的pandas将用户详细信息(用户名,电子邮件,密码)从.csv文件上传到postgres数据库。在数据帧生成之前一切正常,但是一旦我运行代码以上传用户详细信息子串 - " @ gmail.com"来自他们的emai-id在postgres DB中被转换为/存储为小写。 这是我在django应用程序的python shell中编写的代码 -
>>>import sys
>>>from django.contrib.auth import authenticate
>>>from django.contrib.auth import get_user_model
>>>import pandas as pd
>>>User = get_user_model()
>>>df=pd.read_excel('set_A_results_748_web.xlsx',sheetname='Sheet1',parse_cols=(0,3,4))
df.head()
Dataframe First 10 rows Output Screenshot
>>>users = [tuple(x) for x in df.values]
>>>for name, email, password in users:
try:
print ('Creating user {0}.'.format(name))
user = User.objects.create_user(name=name, email=email)
user.set_password(password)
user.save()
assert authenticate(name=name, password=password)
print ('User {0} successfully created.'.format(name))
except:
print ('There was a problem creating the user: {0}. Error: {1}.' \
.format(name, sys.exc_info()[1]))
Postgres User Table Data Screenshot After Uploading
如输出(数据帧df的前10行)所示,每个用户的电子邮件ID都是excel文件中的数据,但当我将它们上传到我的postgres数据库中的auth_user表时,电子邮件的后半部分将转换为小写。
示例:第6行(Dipak Shah)的电子邮件地址将存储为DIPAK.13ME57@gmail.com
,而应按原样存储,即DIPAK.13ME57@GMAIL.COM
。这会在应用程序中产生问题,因为用户得分以及其他详细信息存储在我通过Kettle转换单独上传的另一个得分表中。因此,对于因案例不匹配而导致电子邮件不匹配的记录,分数表中将没有数据。
任何我可能会出错的想法,或者我可以做些什么来避免这种情况。非常感谢任何帮助!
答案 0 :(得分:0)
这与postgres无关,当新用户normalizing the email address作为电子邮件地址的主机部分不区分大小写时,它是is created的django。名称部分是否区分大小写通常取决于邮件服务器。
如果您确实需要使用电子邮件地址作为匹配条件,那么您还应该将相同的规范化应用于其他地址。
编辑:
这种规范化似乎只适用于create_user()
,如果您稍后使用user.email = 'SOMEBODY@EXAMPLE.ORG'
设置了电子邮件地址,那么它将无法应用。但是我并不太依赖于此,这种不同的行为可能会被视为一个错误并在未来版本中得到纠正。