2017-04-25 28 views
2

我使用manage.py dumpdata --format xml --some-more-parameters将数据库的完整转储导出到xml。数据库是MS SQL服务器,我使用pyodbc作为驱动程序。 dumpdata命令使用PowerShell运行,并且由于Django 1.7不支持dumpdata命令的参数--output,所以我使用PowerShell将输出重定向到文件中。在Windows上的Django 1.7 dumpdata加扰unicode字符

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

+0

这个问题的答案!见下文。似乎我需要等待2天才能接受我自己的答案... – Flurin

+0

我在想,如果启动进程python.exe -passthru -argumentlist $ params'能够让你的Powershell脚本访问未经更改的stdout,如果有的话,你可以通过'-redirectstandardoutput'将字符串转换为标准输出。 – Vesper

+0

谢谢。我将在下次访问服务器时尝试一下。 – Flurin

回答

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