Windows上的Django 1.7 dumpdata扰乱了unicode字符

时间:2017-04-25 13:00:54

标签: python django windows powershell python-unicode

我使用manage.py dumpdata --format xml --some-more-parameters将数据库的完整转储导出到xml。数据库是MS sql server,我使用pyodbc作为驱动程序。 dumpdata命令使用PowerShell运行,因为Django 1.7不支持--output命令的dumpdata参数,所以我使用PowerShell将输出重定向到文件中。

不幸的是,数据库包含unicode字符(例如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序列化程序时存在同样的问题。

1 个答案:

答案 0 :(得分:2)

我能够使用自己的导出脚本解决此问题。下面的脚本将转储数据并将其存储在名为export_CURRENT-DATE-TIME.xml的utf-8编码的xml文件中。 call_command()在Django中调用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")