Windows 上的 Django 1.7 dumpdata 打乱了 unicode 字符
Django 1.7 dumpdata on Windows scrambles unicode characters
我使用 manage.py dumpdata --format xml --some-more-parameters
将数据库的完整转储导出到 xml。数据库是 MS sql 服务器,我使用 pyodbc 作为驱动程序。 dumpdata 命令是 运行 使用 PowerShell 并且由于 Django 1.7 不支持 dumpdata
命令的 --output
参数,我使用 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
None 这些命令有效。变音符号和重音符被打乱,另外 > export.xml
方法向文件添加了无效的 BOM
,这将导致 ./manage.py loaddata export.xml
在我尝试将其导入另一台主机时中止并显示 UnicodeDecode 错误消息。
关于如何导出数据和保留特殊字符有什么建议吗?使用 json 或 yaml 序列化程序时存在同样的问题。
我能够使用我自己的导出脚本解决这个问题。下面的脚本将转储数据并将其存储在名为 export_CURRENT-DATE-TIME.xml
的 utf-8 编码 xml 文件中。 call_command()
在 Django 中调用 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")
我使用 manage.py dumpdata --format xml --some-more-parameters
将数据库的完整转储导出到 xml。数据库是 MS sql 服务器,我使用 pyodbc 作为驱动程序。 dumpdata 命令是 运行 使用 PowerShell 并且由于 Django 1.7 不支持 dumpdata
命令的 --output
参数,我使用 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
None 这些命令有效。变音符号和重音符被打乱,另外 > export.xml
方法向文件添加了无效的 BOM
,这将导致 ./manage.py loaddata export.xml
在我尝试将其导入另一台主机时中止并显示 UnicodeDecode 错误消息。
关于如何导出数据和保留特殊字符有什么建议吗?使用 json 或 yaml 序列化程序时存在同样的问题。
我能够使用我自己的导出脚本解决这个问题。下面的脚本将转储数据并将其存储在名为 export_CURRENT-DATE-TIME.xml
的 utf-8 编码 xml 文件中。 call_command()
在 Django 中调用 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")