gpt4 book ai didi

python - 如何使用 django 将我的 sqlite3 数据库转储到 UTF8 中的 SQL?

转载 作者:行者123 更新时间:2023-11-28 16:46:26 26 4
gpt4 key购买 nike

有谁知道下一个问题怎么解决吗?

现在我正在使用这段代码:

def databasedump(request):
# Convert file existing_db.db to SQL dump file dump.sql
con = sqlite3.connect('database.sqlite')
with open('dump.sql', 'w') as f:
for line in con.iterdump():
f.write('%s\n' % line)

我得到这个错误:

Exception Type:
UnicodeEncodeError

Exception Value:
'ascii' codec can't encode character u'\xe9' in position 112: ordinal not in range(128)

无法编码/解码的字符串是:(Arivé, PAK

感谢您对此进行调查!

最佳答案

sqlite3 转储代码中存在错误,跟踪为 issue 15019在 Python 错误跟踪器中。

您可以通过编辑 sqlite3/dump.py 文件并在顶部添加以下行来解决此问题:

from __future__ import unicode_literals

通过运行以下命令找到文件:

python -c 'import sqlite3.dump; print sqlite3.dump.__file__.rstrip("c")'

您必须调整代码行以对现在将从 .iterdump() 方法返回的 unicode 值进行编码:

with open('dump.sql', 'w') as f:  
for line in con.iterdump():
f.write('%s\n' % line.encode('utf8'))

如果您对编辑 Python 标准库源文件感到不自在,请改用以下(固定和缩短的)函数:

def iterdump(connection):
cu = connection.cursor()
yield(u'BEGIN TRANSACTION;')

q = """
SELECT "name", "type", "sql"
FROM "sqlite_master"
WHERE "sql" NOT NULL AND
"type" == 'table'
"""
schema_res = cu.execute(q)
for table_name, type, sql in sorted(schema_res.fetchall()):
if table_name == 'sqlite_sequence':
yield(u'DELETE FROM "sqlite_sequence";')
elif table_name == 'sqlite_stat1':
yield(u'ANALYZE "sqlite_master";')
elif table_name.startswith('sqlite_'):
continue
else:
yield(u'{0};'.format(sql))

table_name_ident = table_name.replace('"', '""')
res = cu.execute('PRAGMA table_info("{0}")'.format(table_name_ident))
column_names = [str(table_info[1]) for table_info in res.fetchall()]
q = """SELECT 'INSERT INTO "{0}" VALUES({1})' FROM "{0}";""".format(
table_name_ident,
",".join("""'||quote("{0}")||'""".format(col.replace('"', '""')) for col in column_names))
query_res = cu.execute(q)
for row in query_res:
yield(u"{0};".format(row[0]))

q = """
SELECT "name", "type", "sql"
FROM "sqlite_master"
WHERE "sql" NOT NULL AND
"type" IN ('index', 'trigger', 'view')
"""
schema_res = cu.execute(q)
for name, type, sql in schema_res.fetchall():
yield(u'{0};'.format(sql))

yield(u'COMMIT;')

像这样使用上面的内容:

con = sqlite3.connect('database.sqlite')
with open('dump.sql', 'w') as f:
for iterdump(con):
f.write('%s\n' % line.encode('utf8'))

关于python - 如何使用 django 将我的 sqlite3 数据库转储到 UTF8 中的 SQL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13394741/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com