【问题标题】:Django: copy data from one database to anotherDjango:将数据从一个数据库复制到另一个
【发布时间】:2012-04-16 13:38:47
【问题描述】:

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

例如:

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

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

以及名为 old.db 的 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)

我想将列 info_id 和 info_name 中的所有数据从 old.db 复制到 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 表不存在...有什么想法吗?

【问题讨论】:

    标签: sql database django sqlite django-models


    【解决方案1】:

    您需要将设置文件中的数据库 URL 切换到 db2 并运行 syncdb 以创建新表。之后,imo 最简单的做法是切换回 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;
    

    【讨论】:

    • 有趣.. 让我试一试,然后回复你! :)
    • 关于倾销?模型中有数据吗?也许尝试使用第二种方法,这是我在您的第一条评论之后添加的。
    • 不在转储.. 在加载:S.. 我也尝试了第二种方法,但它仍然显示“错误:没有这样的表:newdb.Information”..
    • 我确实运行了 syncdb 并且表在那里(我可以在管理员中看到它们)
    • 对,对不起。 loaddata 只使用fixture,因为应用程序名称已经在fixture 中。 ./manage.py loaddata data.json
    【解决方案2】:
    • old.db 中的转储文件包含不在新信息模型中的 info_type 字段。这将使 loaddata 检查从 JSON 文件加载的所有字段失败。您可以在从旧模型转储之前注释掉 info_type 行。
    • Alex 提到的 Attach 方式更简单更棒,需要稍微调整一下

      INSERT INTO newdb.Information SELECT * FROM Information;

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

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

    【讨论】:

    • 感谢您的提示。我通过查看 sqlite 网站上的 INSERT 语法来编写查询,但没有注意到(缺少)括号。
    猜你喜欢
    • 1970-01-01
    • 2017-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-07
    相关资源
    最近更新 更多