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

时间:2012-04-02 21:31:56

标签: sql database django sqlite django-models

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

例如:

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

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

以及db文件中名为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中的info_id和info_name。

我在想这样的事情:

manage.py dbshell

然后

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

这似乎不起作用。它说new.Information表不存在......有什么想法吗?

2 个答案:

答案 0 :(得分:6)

您需要将设置文件中的数据库URL切换到db2并运行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;

答案 1 :(得分:1)

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

    INSERT INTO newdb.Information SELECT * FROM Information;

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

  • 如果您正在执行迁移,请尝试South