将SQLite3数据库(具有非常相似的模式)迁移到已创建的Django模型

时间:2017-05-08 21:03:32

标签: django sqlite migration

请放轻松我,我刚开始在凌晨3点开始使用Django ......

作为学校项目的一部分,我编写了一个Python脚本来抓取数据,生成SQLite3表并将Python字典中的记录插入到所述表中。此SQLite3 db的架构如下所示:

CREATE TABLE state (
                        id INT PRIMARY KEY,
                        name VARCHAR(100) NOT NULL
                      );
CREATE TABLE city (
                        id INT PRIMARY KEY,
                        name VARCHAR(100) NOT NULL
                      );
CREATE TABLE restaurant (
                        id INT PRIMARY KEY,
                        name VARCHAR(100) NOT NULL,
                        rating FLOAT,
                        url VARCHAR(300),
                        price VARCHAR(4),
                        review_count INT,
                        street VARCHAR(100),
                        city VARCHAR(100),
                        state VARCHAR(2),
                        country VARCHAR(100),
                        zip_code INT,
                        phone VARCHAR(20),
                        image_url VARCHAR(300)
                      );
CREATE TABLE category (
                        id INT PRIMARY KEY,
                        title VARCHAR(100)
                      );
CREATE TABLE restaurant_by_category (
                        restaurant_id INT,
                        category_id INT,
                        FOREIGN KEY (restaurant_id) REFERENCES restaurant,
                        FOREIGN KEY (category_id) REFERENCES category
                      );
CREATE TABLE review (
                        url VARCHAR(300) PRIMARY KEY,
                        restaurant_id INT,
                        rating FLOAT,
                        name VARCHAR(100),
                        time VARCHAR(100),
                        text VARCHAR(300)
                      );

制作这个数据库几周后,我决定开始使用Django制作网络应用程序。我有一个(基本上)完全可操作的Django应用程序,其SQLite3后端models.py看起来像这样:

class City(models.Model):
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name


class State(models.Model):
  name = models.CharField(max_length=100)

  def __str__(self):
    return self.name


class Restaurant(models.Model):
  name = models.CharField(max_length=100)
  rating = models.DecimalField(max_digits=2, decimal_places=1, null=True,
      blank=True)
  url = models.CharField(max_length=300, blank=True, null=True)
  price = models.CharField(max_length=4)
  review_count = models.IntegerField(blank=True, null=True)
  phone = models.CharField(max_length=14, blank=True, null=True)
  image_url = models.CharField(max_length=300, blank=True, null=True)
  city = models.ForeignKey(City, blank=True, null=True)
  state = models.ForeignKey(State, blank=True, null=True)
  state_abbreviation = models.CharField(max_length=2, blank=True, null=True)
  zip_code = USZipCodeField(blank=True, null=True)
  street = models.CharField(max_length=100, blank=True, null=True)

  def __str__(self):
    return self.name


class Review(models.Model):
  url = models.CharField(max_length=300)
  restaurant_id = models.IntegerField(blank=True, null=True)
  rating = models.DecimalField(max_digits=2, decimal_places=1, null=True,
      blank=True)
  name = models.CharField(max_length=100, blank=True, null=True)
  time = models.DateTimeField(blank=True, null=True)
  text = models.CharField(max_length=100, blank=True, null=True)


class Category(models.Model):
  title = models.CharField(max_length=100, blank=True, null=True)


class RestaurantByCategory(models.Model):
  restaurant_id = models.ForeignKey(Restaurant)
  category_id = models.ForeignKey(Category)

除了这两个差异之外,我之前存在的SQLite3数据库和我的Django模型几乎完全相同:

  • Restaurant模型在SQLite3数据库中有一个额外的字段state_abbreviation,实际上是state - state模型中的Restaurant SQlite3数据库中没有相关字段。当我将SQLite3数据库迁移到Django时,我不关心Django模型中的state字段是否为None,因为数据库中只有三个状态,我可以轻松地手动添加它通过管理页面,但我希望将SQLite3数据库中的state属性输入到state_abbreviation模型实例的Restaurant字段中。

  • 有几种字段类型不匹配,例如DateTimeField中的ReviewUSZipCodeField中的Restaurant或{ForeignKey中的Restaurant 1}} ...所有这些都在我的SQLite3数据库中声明为VARCHAR

我的问题是,如何快速安全地将现有的SQLite3数据库自动迁移到我的新Django模型中?

以下是我研究的内容:

这就是为什么我被困住了,无法弄清楚下一步该做什么:

  • 后面的选项(灯具)看起来不像我正在寻找的东西,因为根据我的理解,这只有在我从另一个数据库迁移到另一个数据库时才有效,新数据库和旧数据库都在在我的Django应用程序中...我的情况需要从SQLite架构转储数据,我认为这是不可能的 - 至少不能解决我的问题。
  • 前一个选项看起来有点像我想要的,除了这个例子让我觉得我必须手动为所有记录编写模型实例,这不会比只输入所有记录更好通过管理页面记录。

  • 我也觉得字段类型不匹配和略有不同的架构(请参阅Restaurant中的状态/ state_abbreviation属性的差异)会抛弃此迁移过程,即使有办法自动迁移我的SQLite3数据库到我的Django模型。

那么,我是否仍然坚持手动输入记录或是否有一种简单的方法来执行此迁移? SQLite3表中只有大约400条记录,所以我可以手动输入一堆来获取工作演示,然后明天展示这个项目,但在此之前我还有很多其他事情要做已完成,我宁愿不花3小时手动输入记录。

提前感谢您的帮助。

0 个答案:

没有答案