Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sqlite/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将SQLite3数据库(带有非常相似的模式)迁移到已创建的Django模型_Django_Sqlite_Migration - Fatal编程技术网

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

将SQLite3数据库(带有非常相似的模式)迁移到已创建的Django模型,django,sqlite,migration,Django,Sqlite,Migration,请对我放松点,我今天凌晨3点才开始使用Django 作为学校项目的一部分,我编写了一个Python脚本来收集数据,生成SQLite3表,并将Python字典中的记录插入到这些表中。此SQLite3数据库的架构如下所示: CREATE TABLE state ( id INT PRIMARY KEY, name VARCHAR(100) NOT NULL );

请对我放松点,我今天凌晨3点才开始使用Django

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

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)
                      );
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)
制作这个数据库几周后,我决定开始使用Django制作这个web应用程序。我有一个(基本上)完全可操作的Django应用程序,带有SQLite3后端,其
models.py
如下所示:

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)
                      );
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
    模型有一个附加字段
    state\u缩写
    ,它实际上是SQLite3数据库中的
    state
    Restaurant
    模型中的
    state
    在SQLite3数据库中没有相应字段。当我将SQLite3数据库迁移到Django时,我不在乎Django模型中的
    状态
    字段是否为
    None
    ,因为数据库中只有三种状态,我可以通过管理页面轻松地手动添加它们,但是我确实希望SQLite3数据库中的
    state
    属性被输入到我的
    餐厅
    模型实例的
    state\u缩写
    字段中

  • 存在多个字段类型不匹配,例如
    Review
    中的
    DateTimeField
    Restaurant
    中的
    USZipCodeField
    ,或者
    Restaurant
    中的
    ForeignKey
    。所有这些都在我的SQLite3数据库中声明为
    VARCHAR

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

以下是我所研究的:

  • 创建迁移文件,然后执行批量插入到我的模型中的功能
  • 存储我先前存在的模式,然后将其加载到Django模型中
这就是为什么我被困住了,不知道下一步该做什么:

  • 后面的选项(固定装置)似乎不是我想要的,因为据我所知,这只有在我从另一个数据库迁移到另一个数据库时才有效,因为新数据库和旧数据库都在我的Django应用程序中……我的情况需要从SQLite模式转储数据,我认为这是不可能的——至少不能解决我的问题
  • 前一个选项似乎有点像我想要的,除了这个示例使我看起来好像无论如何都必须手动为所有记录编写模型实例,这不会比通过管理页面输入所有记录更好

  • 我还觉得字段类型不匹配和模式稍有不同(请参阅
    Restaurant
    中state/state_缩写属性的差异)会中断此迁移过程,即使有办法自动从SQLite3数据库迁移到Django模型

那么,我是不是很难手动输入记录,还是有一种简单的方法来执行迁移?SQLite3表中只有大约400条记录,所以我可以在明天展示这个项目之前手动输入一组记录以获得一个工作演示,但是在完成之前我还有很多其他事情要做,我不想花3个小时手动输入记录


提前感谢您的帮助。

其他选项:在Django和中重写模型;或者按原样使用数据库,谢谢@ColonelThirtyTwo--第一个链接+加上一个迁移文件帮了我的忙。@colonelthirtwo我认为这应该是一个答案(当然还有一点细节)。如果他没有回答,请加上你自己的答案解释你做了什么。因为这是一个很好的问题,所以需要额外的选项:在Django和中重写模型;或者按原样使用数据库,谢谢@ColonelThirtyTwo--第一个链接+加上一个迁移文件帮了我的忙。@colonelthirtwo我认为这应该是一个答案(当然还有一点细节)。如果他没有回答,请加上你自己的答案解释你做了什么。因为这是个好问题