2017-04-25 2 views
2

manage.py dumpdata --format xml --some-more-parameters을 사용하여 데이터베이스의 전체 덤프를 xml로 내보내십시오. 데이터베이스는 MS SQL 서버이며 pyodbc를 드라이버로 사용하고 있습니다. dumpdata 명령은 PowerShell을 사용하여 실행되며 Django 1.7은 인수 (dumpdata 명령)를 지원하지 않으므로 출력을 PowerShell을 사용하여 파일로 리디렉션합니다.Windows 용 Django 1.7 dumpdata는 유니 코드 문자를 암호화합니다

유감스럽게도 데이터베이스에는 유니 코드 문자 (예 : country \ xd6sterreich)가 포함되어 있으며 이러한 문자는 내보내기 파일로 스크램블됩니다.

다음은 작동하지 않았다 무엇 :이 명령의

./manage.py dumpdata --format xml > export.xml

./manage.py dumpdata --format xml | out-file -encoding utf8 export.xml

./manage.py dumpdata -format xml | out-file -encoding ANY_OTHER_SUPPORTED_ENCODING export.xml

없음이 작동하지 않습니다. 움라우트와 악센트가 뒤섞이고 추가적으로 > export.xml 메서드는 파일에 BOM을 잘못 입력하여 다른 호스트에서이 파일을 가져 오려고 시도 할 때 ./manage.py loaddata export.xml이 UnicodeDecode 오류 메시지로 중단됩니다.

데이터를 내보내고 특수 문자를 보존 할 수있는 방법에 대한 제안 사항이 있습니까? json 또는 yaml serializer를 사용할 때도 동일한 문제가 발생합니다.

+0

이 질문에 대답한다! 아래를 참조하십시오. 내 자신의 대답을 받아 들일 수 있기 전에 2 일을 기다려야하는 것 같아 ... – Flurin

+0

'start-process python.exe -passthru -argumentlist $ params'가 Powershell 스크립트가 변경되지 않은 stdout에 접근 할 수있게 해주는 지 궁금합니다. 어떤 것이 든,'-redirectstandardoutput'으로 stdout을 문자열로 얻을 수 있습니다. – Vesper

+0

감사합니다. 다음에 서버에 액세스 할 때 사용해 보겠습니다. – Flurin

답변

2

내 자신의 내보내기 스크립트를 사용하여이 문제를 해결할 수있었습니다. 아래 스크립트는 데이터를 덤프하고 export_CURRENT-DATE-TIME.xml이라는 utf-8로 인코딩 된 xml 파일에 저장합니다. call_command()은 장고에서 dumpdata 명령을 호출합니다. 아래의 스크립트는 다음 인수 dumpdata 사용하는 것과 같아야합니다

./manage.py dumpdata --natural --natural-foreign --natural-primary --format xml --indent 2

import sys 
import codecs 
import os 
import django 
from django.core.management import call_command 
from StringIO import StringIO 
from datetime import datetime 

# setup access to django 
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "PROJECT_NAME.settings") 
django.setup() 

# the actual export command 
def do_work(): 
    #print(u"\xd6sterreich") 
    call_command('dumpdata', use_natural_keys=True, use_natural_foreign_keys=True, use_natural_primary_keys=True, format='xml', indent=2) 

# nasty hack to workaround encoding issues on windows 
_stdout = sys.stdout 
sys.stdout = StringIO() 
do_work() 

value = sys.stdout.getvalue().decode('utf-8') 
sys.stdout = _stdout 

with codecs.open('export_{}.xml'.format(datetime.now().strftime("%Y-%m-%d_%H-%M")), 'w', 'utf-8-sig') as f: 
    f.write(value) 

print("export completed")