2012-04-02 229 views
2

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

例如:

我叫new.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中的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表不存在...任何想法?

回答

5

您需要将设置文件中的数据库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; 
+0

有趣..让我给一个尝试,并送还给你! :) – JohnnyCash 2012-04-02 21:40:42

+0

ValueError:没有JSON对象可以解码....想法? – JohnnyCash 2012-04-02 21:43:03

+0

关于倾销?你有模型中的数据吗?也许尝试使用第二种方法,我在第一个评论后添加了这种方法。 – 2012-04-02 21:50:29

1
  • 从old.db转储的文件包含资讯类型字段不在新的信息模型中。这将会失败loaddata,它检查从JSON文件加载的所有字段。您可以在从旧模型转储之前注释掉info_type行。
  • 亚历克斯提到的连接方式更容易和伟大的,这需要一个微小的调整

    INSERT INTO newdb.Information SELECT * FROM Information;

    注意到周围的SELECT缺少括号,SQLite不接受他们。参考文献http://sqlite.org/lang_insert.html

  • 如果要执行迁移,你有没有试过South
+0

谢谢你的parens提示。我通过查看sqlite网站上的INSERT语法来编写查询,但未注意到(缺少)parens。 – 2012-04-03 11:43:10

相关问题