记Django数据库迁移过程中遇到的一些问题
首先描述一下问题,Django 数据库使用的mysql, 然后开始没注意,没建一个default库,就把第一个数据库当成默认的了,结果Django的admin相关的那些表,都自动生成到这个库里了,现在想迁移出来,放到一个新的数据库里,遇到的问题就是,migration是成功的,但是迁移的时候就是不成功
最终问题是解决了,可能原因有以下几个:
1. 我发现我的urls.py 文件中,有两个不同路径对应了一个相同的试图函数,其实就是写了两个url来对应admin, 然后我把这两个注释了一个,最后竟然就好了,反正我是不会相信是这个问题导致的
2. 最开始的时候是使用sqlite的,所以服务器上还有sqlite数据库文件,我把它删掉了
3. 当我在数据库手动清空django_migrations表的时候,使用的delete命令,删掉数据后,id还是从之前的顺序排,后来换成了直接用truncate命令清空的数据表
4. 我单独建了一个default数据库,为了把Django自带的哪些admin,session, auth 这些表单独放到一个数据库,我现在看来,问题出在这的可能性最大, 应该是还有个地方存migrations文件的,所以每次迁移,都没有删掉这个文件里的内容,导致出错
首先, 你得保证,不是migrations文件夹中的文件导致的冲突,如果当你迁移数据库的时候,报错说是xx表不存在,或者xx表已存在,首先应该想到的就是解决一下这个问题,当然最暴力的方法就是
1. 删除这个文件夹下的除了__init__.py文件之外的所有文件;
2. 从数据库中删掉django_migrations表中的数据;
当然如果你能找到冲突的那条记录,只删那一条记录是最好的
删除成功后,在python manage.py makemigrations
python manage.py migrate
然后记录一下Django使用mysql, 使用多数据库时应该注意的一些地方:
首先要在settings中配置好多个数据库,
DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# },
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'dja......t',
'USER': 'root',
'PASSWORD': 't.....',
'HOST': '34.....',
'PORT': '',
"OPTIONS": {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
}
},
'slots_config': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'slo....',
'USER': 'root',
'PASSWORD': 't......',
'HOST': '34.2.......',
'PORT': '',
"OPTIONS": {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
# 'charset': 'utf8mb4'
}
},
'permission': {
'ENGINE': 'django.db.backends.mysql',
'NAME': 'sl.....',
'USER': 'root',
'PASSWORD': 't....',
'HOST': '34.237....',
'PORT': '',
"OPTIONS": {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'",
# 'charset': 'utf8mb4'
}
},
}
我的做法是一个app配一个数据库,所以要把app和数据库对应起来,写一个map映射关系
DATABASE_APPS_MAPPING = {
# "default": "default",
"permission_control": "permission",
"slo...": "s.....",
"auth": "default",
"session": "default",
"contenttypes": "default",
"admin": "default",
}
同时,还需要一个路由,来指定model 和 数据库之间的路由关系,在settings同级目录下写一个文件,从settings中引用:
DATABASE_ROUTERS = ['s......nd.database_router.DatabaseAppsRouter'] # 数据库路由规则
文件内容:
from django.conf import settings DATABASE_MAPPING = settings.DATABASE_APPS_MAPPING class DatabaseAppsRouter(object):
"""
A router to control all database operations on models for different
databases. In case an app is not set in settings.DATABASE_APPS_MAPPING, the router
will fallback to the `default` database. Settings example: DATABASE_APPS_MAPPING = {'app1': 'db1', 'app2': 'db2'}
""" def db_for_read(self, model, **hints):
""""Point all read operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None def db_for_write(self, model, **hints):
"""Point all write operations to the specific database."""
if model._meta.app_label in DATABASE_MAPPING:
return DATABASE_MAPPING[model._meta.app_label]
return None def allow_relation(self, obj1, obj2, **hints):
"""Allow any relation between apps that use the same database."""
db_obj1 = DATABASE_MAPPING.get(obj1._meta.app_label)
db_obj2 = DATABASE_MAPPING.get(obj2._meta.app_label)
if db_obj1 and db_obj2:
if db_obj1 == db_obj2:
return True
else:
return False
return None def allow_syncdb(self, db, model):
"""Make sure that apps only appear in the related database.""" if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(model._meta.app_label) == db
elif model._meta.app_label in DATABASE_MAPPING:
return False
return None def allow_migrate(self, db, app_label, model=None, **hints):
"""
Make sure the auth app only appears in the 'auth_db'
database.
"""
if db in DATABASE_MAPPING.values():
return DATABASE_MAPPING.get(app_label) == db
elif app_label in DATABASE_MAPPING:
return False
return None
ok, 这样就按app来区分了不同的数据库
这样在views中,操作数据的时候,也不用use 这种语法了,能自动根据app去连接对应的数据库
哦,对了,在model中,每个表都要明确指定app名称,类似这样
class App(models.Model):
"""
app表
""" caption = models.CharField(verbose_name="应用名", null=True, blank=True, max_length=64)
app_id = models.IntegerField(verbose_name="app_id")
product = models.ForeignKey(Product, verbose_name="所属产品", related_name="apps")
role = models.ManyToManyField(to="Role", verbose_name="拥有角色", blank=True) class Meta:
app_label = "permission_control" # 这里,指明app名称,用来对应app 和 数据库的map表
db_table = "app"
记Django数据库迁移过程中遇到的一些问题的更多相关文章
- Django数据库设计中字段为空的方式
今天在做数据库设计的时候,设计了如下User表,其中我把email和phone字段设置为允许为空: class User(models.Model): username = models.CharFi ...
- 阿里云数据库RDS迁移,DTS 迁移过程中,是否会锁表,对源数据库是否有影响?
阿里云数据库RDS迁移,DTS 迁移过程中,是否会锁表,对源数据库是否有影响? DTS 在进行全量数据迁移和增量数据迁移的过程中,均不会对源端数据库进行锁表,因此在全量数据迁移和增量数据迁移的过程中, ...
- Django学习路5_更新和删除数据库表中元素
查找所有的元素 Student.objects.all() 查找单个元素 Student.objects.get(主键=值) 主键 pk = xxx 更新数据库数据后进行保存 stu.save() 删 ...
- Django 数据库
一.操作数据库 Django配置连接数据库: 在操作数据库之前,首先先要连接数据库.这里我们以配置MySQL为例来讲解.Django连接数据库,不需要单独的创建一个连接对象.只需要在settings. ...
- django数据库操作和中间件
数据库配置 django的数据库相关表配置在models.py文件中,数据库的连接相关信息配置在settings.py中 models.py相关相关参数配置 from django.db import ...
- Django 1.10 中文文档------3.2.2 查询操作making queries
3.2.2 查询操作 6.15章节包含所有模型相关的API解释. 后面的内容基于如下的一个博客应用模型: from django.db import models class Blog(models. ...
- Django 1.10 中文文档------3.3.8 会话sessions
django支持匿名会话.它将数据存放在服务器端,并抽象cookies的发送和接收过程.cookie包含一个会话ID而不是数据本身(除非你使用的是基于后端的cookie). 3.3.8.1 启用会话 ...
- Python之路【第十九章】:Django 数据库对象关系映射
Django ORM基本配置 到目前为止,当我们的程序涉及到数据库相关操作时,我们一般都会这么搞: 创建数据库,设计表结构和字段 使用 MySQLdb 来连接数据库,并编写数据访问层代码 业务逻辑层去 ...
- Django学习笔记(二)——django数据库的使用
1.模型——SQLite3数据库使用 使用django的数据库必须创建一个app python manage.py startapp check 创建app 此时manage.py的目录下会多一个c ...
随机推荐
- html下拉菜单栏代码
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- Python9-From-CSS-day48
1.form表单相关内容前后端有数据交互的时候用form表单form表单提交数据的几个注意事项: 1.所有获取用户输入的标签都必须放在form表单里面 2.action 控制着往哪里提交 3.inpu ...
- java并发面试题-基础
多线程 java中有几种方法可以实现一个线程? 1.直接继承thread类:2.实现runnable接口: 如何停止一个正在运行的线程?可以使用正在运行的线程,支持线程中断,通常是定义一个volati ...
- 驱动模块 .ko
模块: 模块机制,作用搞高LINUX操作系统的扩充性. 1. 模块概念: 1.动态可加载内核模块LKM 2.内核空间运行 3.是不是一执行文件,是一个没有经过链接,不能独立运行的一个目标文件(.c-& ...
- 【Median of Two Sorted Arrays】cpp
题目: There are two sorted arrays A and B of size m and n respectively. Find the median of the two sor ...
- IOS开发学习笔记017-第一个IOS应用
第一个IOS应用程序,就从最简单的开始吧. 1.先了解一下开发环境,Xcode的相关组成 2.还有模拟器 3.运行与停止按钮 4.新建一个工程 5.看看main函数里都有啥 6.现在来添加一个控件 1 ...
- 移动弱网测试方案Network Emulator for Windows Toolkit
移动app在测试时,有时需要考虑弱网的情形下,app的表现,那么怎么营造这样子的环境呢? 一.首先需要控制网络,有两种方式其一使用网络损伤仪进行,其二采用软件方式.硬件采购费用太贵,因此使用win平台 ...
- 非旋Treap总结 : 快过Splay 好用过传统Treap
非旋$Treap$ 其高级名字叫$Fhq\ Treap$,既然叫$Treap$,它一定满足了$Treap$的性质(虽然可能来看这篇的人一定知道$Treap$,但我还是多说几句:$Fhp\ Treap$ ...
- docker常用命令整理
Docker常见用法整理 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器. Docker 容器通过 Docker 镜像来创建.容器与镜像的关系类似于 ...
- SQL Server2012使用导入和导出向导时,用sql语句作为数据源,出现数据源类型会变成202或者203
用MS SqlServer2012进行数据导出时,使用的查询语句导出,但是出现了错误: “发现 xx个未知的列类型转换您只能保存此包“ 点击列查看详细错误信息时,可以看到: [源信息]源位置: 192 ...