Django:将数据从一个数据库复制到另一个数据库

5

我有两个sqlite.db文件。我想要将一个db文件中表格的某一列内容复制到另一个db文件中。

例如:

我在名为new.db的db文件中有模型信息:

class Information(models.Model):
        info_id = models.AutoField(primary_key = True)
        info_name = models.CharField( max_length = 50)

同时,下面是一个名为old.db的数据库文件中使用的信息模型:

class Information(models.Model):
            info_id = models.AutoField(primary_key = True)
            info_type = models.CharField(max_length = 50)
            info_name = models.CharField( max_length = 50)

我希望将old.db中info_id和info_name两列的所有数据复制到new.db中的相应列。

我想大概是这样:

manage.py dbshell

那么

INSERT INTO "new.Information" ("info_id", "info_name")
SELECT "info_id", "info_name"
FROM "old.Information";

这似乎无法正常工作。它显示新的“Information”表不存在...有什么想法吗?
2个回答

10

您需要在设置文件中切换到db2的数据库URL,并运行syncdb以创建新的表格。之后,在我的观点中,最容易做的事情是切换回db1并运行./manage.py dumpdata myapp > data.json,然后再切换到db2,您可以运行./manage.py loaddata data.json

此后,您可以从db2中删除不需要的数据。

编辑:另一种方法是使用sqlite的ATTACH函数。首先,我建议您执行上述第一步(更改数据库设置并使用syncdb创建表),然后您可以切换回去并执行以下操作:

./manage.py dbshell

> ATTACH DATABASE 'new.db' AS newdb;
> INSERT INTO newdb.Information SELECT * FROM Information;

有趣..让我试一下,然后回复你! :) - JohnnyCash
在转储方面?您的模型中是否有数据?也许可以尝试使用第二种方法,这是在您的第一条评论之后添加的。 - Alex Vidal
不是在卸载上出问题,而是在加载上 :S.. 我也尝试了第二种方法,但仍然显示“错误:没有这样的表:newdb.Information”。 - JohnnyCash
我肯定运行了syncdb,表格已经存在(我可以在管理界面中看到它们)。 - JohnnyCash
啊,对不起。loaddata 命令只需要指定 fixture 文件,因为应用程序名称已经在 fixture 中了。例如:./manage.py loaddata data.json - Alex Vidal

1
  • 从 old.db 转储的文件包含 info_type 字段,而新的信息模型中没有该字段。这将导致 loaddata 失败,因为它会检查从 JSON 文件加载的所有字段。您可以在从旧模型转储之前注释掉 info_type 行。
  • Alex 提到的附加方式更简单、更好,只需要微调一下

    INSERT INTO newdb.Information SELECT * FROM Information;

    注意 SELECT 周围缺少括号,sqlite 不接受它们。参考 http://sqlite.org/lang_insert.html

  • 如果您正在执行迁移操作,是否尝试过 South

感谢提供括号贴士。我是通过查看 SQLite 网站上的 INSERT 语法编写查询的,但没有注意到缺少括号。 - Alex Vidal

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接