CSV로 사용자 가져오기

CSV를 통해 사용자를 초대하는 ‘프론트엔드’ 방식이 있다는 것은 알고 있습니다. 하지만 제 경우 이는 작동하지 않습니다. 사이트에 추가될 수천 명의 사용자에게 이메일이 발송되기 때문이죠.

CLI을 통해 추가하려고 하면 다음과 같은 오류가 발생합니다.

/var/www/discourse# rails runner script/import_scripts/csv_importer.rb /var/www/discourse/tmp/users.csv
Loading existing groups…
Loading existing users…
Loading existing categories…
Loading existing posts…
Loading existing topics…
File doesn’t exist: /var/www/discourse/tmp/emails.csv
File doesn’t exist: /var/www/discourse/tmp/custom_fields.csv
bundler: failed to load command: script/rails (script/rails)
/var/www/discourse/script/import_scripts/csv_importer.rb:29:in initialize': undefined method headers’ for nil (NoMethodError)

@imported_custom_fields_names = @imported_custom_fields.headers.drop(1)
                                                       ^^^^^^^^

무엇이 문제일 수 있을까요?

이 스크립트는 마이그레이션 스크립트이며, 사용자를 추가하는 단일 작업을 수행하도록 의도된 것이 아닙니다.

실제 사용자 계정을 대량으로 생성하려는 건가요, 아니면 테스트용인가요?

아하! import를 보지 migration을 본 거였군요! 조언해 주셔서 감사합니다.

CSV로 많은 수의 사용자를 가져오고 싶습니다.

Import과 migrate는 대부분 동의어입니다.

이 기능은 해당 사용자들을 모두 생성하는 역할을 수행해야 합니다(비밀번호가 없으므로, 이메일을 통해 비밀번호를 설정해야 합니다).

이를 작동시키기 위해 프로그래밍에 대해 약간 이해하고 있어야 할 가능성이 높습니다.

우선 생일 축하해.

나는 프로그래밍 기술이 거의 없어. import.rb 파일을 실행해서 users.csv를 가리키기만 하면 되는 거라고 생각했지.

그런데 출력된 에러는 도무지 무슨 뜻인지 모르겠어. import 스크립트의 29번째 줄을 살펴보니 headers라는 단어가 나와서, csv 파일의 컬럼을 가리키는 거라고 짐작하고 그 부분을 이것저것 만져봤지만 아무 소용이 없었어.

음, csv 파일이 아예 열리지 않았으니 멀리 가지는 못했겠네요.

30초면 끝날 수도 있고, 몇 시간이나 걸릴 수도 있는 그런 골치 아픈 상황 중 하나입니다.

하지만 파일을 해당 위치로 복사해 보는 것도 방법입니다. 컴퓨터의 파일 시스템의 한 위치와 컨테이너 내부의 다른 위치를 연결해야 하므로 까다롭습니다. 그 문제를 해결하면 열 제목(column headings)을 수정하기 시작할 수 있습니다.

원래 문제[1]에 대해서는 쉬운 해결책이 있는 경우가 있습니다.

이메일을 비활성화하고, 사용자를 가져온 다음, 다시 이메일을 활성화하세요.


  1. x-y 문제 참고 ↩︎

아하 - 그런데 여기서는 제가 생각하기에 가져오기(importer)가 users.csv를 선택한 것 같습니다.

emails.csv 같은 파일은 가져오거나 원하지도 않습니다.

혹시 이게 다중 부분(multipart) 가져오기 방식인가요? 즉, 사용자(이름)는 하나의 CSV 파일에 있고, 이메일은 다른 CSV 파일(emails.csv)에 있는 경우를 말하는 건가요?

users.csv 파일은 에러를 내뱉지 않는 것으로 보아, 해당 파일은 찾은 것 같습니다.

최근 코드를 확인해 보지는 않았지만, 사용자 CSV에는 이메일 주소가 포함되어야 합니다. 주제와 게시글은 다른 CSV에 있습니다.

좋아요, 제가 올바른 방향으로 가고 있네요. 계속 열심히 해보겠습니다.

파일명이 설정되는 위치는 다음과 같습니다:

  CSV_FILE_PATH = ENV["CSV_USER_FILE"] || "/var/www/discourse/tmp/users.csv"

따라서 해당 위치에 파일을 두거나, CSV_USER_FILE 환경 변수를 파일을 저장한 경로로 설정하면 됩니다.

다만, 스크립트가 처음 수행하는 작업은 예상되는 모든 CSV 파일을 읽어드리는 것입니다(모든 @... = load_csv 라인). 따라서 필요하지 않은 부분은 주석 처리하거나 삭제해야 합니다. 또한 import_users는 사용자 정의 필드 데이터를 확인하므로, 이 부분도 수정해야 합니다.

이 정도가 충분한 힌트가 되지 않는다면, 예산이 있다면 (프로필에 있는) 제 이메일로 금액을 보내주시면 해당 금액으로 도움을 드릴 방법을 찾아보겠습니다.