2016-09-23 2 views
0

Pythonでpandasを使用して.csvファイルからユーザーの詳細(ユーザー名、電子メール、パスワード)をpostgres DBにアップロードしています。データフレームが生成されるまでは大丈夫ですが、ユーザの詳細をアップロードするためのコードを実行すると、emai-idからの "@ gmail.com"という部分文字列がpostgres DBの小文字に変換/格納されます。 これは私がDjangoアプリケーションのPythonシェルで書かれたコードである - に示すようPythonでpandasを使用してexcelファイルからユーザーの詳細をアップロードするPostgresにデータベース

>>>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

出力(最初の10行のデータフレームdf)すべてのユーザーの電子メールIDはExcelファイルのデータに添付されますが、auth_userにアップロードすると私のpostgres DBのテーブルは、電子メールの後半部分が小文字に変換されます。

例:行6(Dipak Shah)の電子メールアドレスは[email protected]として保存されますが、つまり[email protected]として保存されます。これは、他の詳細と一緒にユーザのスコアが別のスコアテーブルに格納されていて、ケトル変換を介して別にアップロードするので、アプリケーションで問題を引き起こします。したがって、大文字小文字の不一致のため電子メールの不一致があるレコードの場合は、スコア表にデータはありません。

私が間違っているかもしれない、または私がthis.Anyを避けるために何ができるかについてのアイデアは、非常に高く評価されるでしょう!

答えて

0

これはpostgresとは関係がありません。新しいユーザーis createdが、大文字と小文字を区別しないので、normalizing the email addressのdjangoです。名前の部分が大文字と小文字を区別するかどうかは、通常、メールサーバーによって異なります。

電子メールアドレスを一致条件として使用する必要がある場合は、他のアドレスにも同じ正規化を適用する必要があります。

編集:

あなたが後でそれは適用されませんuser.email = '[email protected]'を使用して電子メールアドレスを設定した場合、この正規化は唯一、create_user()に適用されているようです。しかし、私はあまりそれに頼りすぎることはありません。そのような異なる動作はバグとみなされ、将来のバージョンで修正される可能性があります。

+0

ありがとうございました!ケトル変換を通じてスコアデータをDBにアップロードする前に、すべての電子メールIDを小文字に変換しました。また、django.contrib.auth.base_userのBaseUserManagerクラスを拡張する独自のPythonクラスを定義することで、(ドメイン部分ではなく)ユーザーの電子メールID全体を正規化しました。両方のテーブルの電子メールは小文字で格納されます。 –

関連する問題