django数据库迁移sqlmigrate调试

django>=1.7数据库迁移只有三个命令

migrate,用来迁移数据库。

用法:migrate app

makemigrations,用来检测数据库变更和生成数据库迁移文件。

用法:makemigratioins app

sqlmigrate,用来把数据库迁移文件转换成数据库语言(displays the SQL statements for a migratioin.)

用法:sqlmigrate app migration,比如makemigrations生成了0001_initial.py,就用sqlmigrate app 0001_intial,这里0001_initial就是migration参数。

一般如果某次migration使用sqlmigrate没有提示错误,那么在migrate时就能成功。

migrate成功例子:

[email protected]:~/redguy# python manage.py migrate accost
Operations to perform:
  Apply all migrations: accost
Running migrations:
  Applying accost.0002_auto_20141212_1327... OK

如果是失败:

Operations to perform:
  Apply all migrations: accost
Running migrations:
  Applying accost.0002_auto_20141212_1327... FAKED

所以如果migrate失败了,可以用sqlmigrate调试。

比如:

[email protected]:~/redguy# python manage.py sqlmigrate accost 0002_auto_20141212_1323
Traceback (most recent call last):
  File "manage.py", line 10, in <module>
    execute_from_command_line(sys.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 385, in execute_from_command_line
    utility.execute()
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/__init__.py", line 377, in execute
    self.fetch_command(subcommand).run_from_argv(self.argv)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 288, in run_from_argv
    self.execute(*args, **options.__dict__)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/sqlmigrate.py", line 30, in execute
    return super(Command, self).execute(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/base.py", line 338, in execute
    output = self.handle(*args, **options)
  File "/usr/local/lib/python2.7/dist-packages/django/core/management/commands/sqlmigrate.py", line 61, in handle
    sql_statements = executor.collect_sql(plan)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/executor.py", line 77, in collect_sql
    migration.apply(project_state, schema_editor, collect_sql=True)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/migration.py", line 107, in apply
    operation.database_forwards(self.app_label, schema_editor, project_state, new_state)
  File "/usr/local/lib/python2.7/dist-packages/django/db/migrations/operations/fields.py", line 139, in database_forwards
    schema_editor.alter_field(from_model, from_field, to_field)
  File "/usr/local/lib/python2.7/dist-packages/django/db/backends/schema.py", line 470, in alter_field
    new_field,
ValueError: Cannot alter field accost.Accost.like into accost.Accost.like - they are not compatible types (you cannot alter to or from M2M fields, or add or remove through= on M2M fields)

上面提示说不能将accost.Accost.like alter为一个M2M(ManyToMany)fields,这种情况,把字段like换个名字就行了,换成likes。然后在执行sqlmigrate就成功。

如下:

[email protected]:~/redguy# python manage.py sqlmigrate accost 0002_auto_20141212_1327
BEGIN;
ALTER TABLE "accost_accost" DROP COLUMN "collected" CASCADE;
ALTER TABLE "accost_accost" DROP COLUMN "like" CASCADE;
CREATE TABLE "accost_accost_collects" ("id" serial NOT NULL PRIMARY KEY, "accost_id" integer NOT NULL, "myuser_id" integer NOT NULL, UNIQUE ("accost_id", "myuser_id"));
CREATE TABLE "accost_accost_likes" ("id" serial NOT NULL PRIMARY KEY, "accost_id" integer NOT NULL, "myuser_id" integer NOT NULL, UNIQUE ("accost_id", "myuser_id"));
CREATE INDEX accost_accost_collects_372770c0 ON "accost_accost_collects" ("accost_id");
ALTER TABLE "accost_accost_collects" ADD CONSTRAINT "accost_accost_co_accost_id_2b66c74632ab3db8_fk_accost_accost_id" FOREIGN KEY ("accost_id") REFERENCES "accost_accost" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX accost_accost_collects_8b14fb18 ON "accost_accost_collects" ("myuser_id");
ALTER TABLE "accost_accost_collects" ADD CONSTRAINT "accost_accost__myuser_id_1bf115233bc10d70_fk_accounts_myuser_id" FOREIGN KEY ("myuser_id") REFERENCES "accounts_myuser" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX accost_accost_likes_372770c0 ON "accost_accost_likes" ("accost_id");
ALTER TABLE "accost_accost_likes" ADD CONSTRAINT "accost_accost_li_accost_id_3700c980b7e22204_fk_accost_accost_id" FOREIGN KEY ("accost_id") REFERENCES "accost_accost" ("id") DEFERRABLE INITIALLY DEFERRED;
CREATE INDEX accost_accost_likes_8b14fb18 ON "accost_accost_likes" ("myuser_id");
ALTER TABLE "accost_accost_likes" ADD CONSTRAINT "accost_accost__myuser_id_6af76a97d74d7ca4_fk_accounts_myuser_id" FOREIGN KEY ("myuser_id") REFERENCES "accounts_myuser" ("id") DEFERRABLE INITIALLY DEFERRED;
COMMIT;
时间: 2024-10-04 11:10:58

django数据库迁移sqlmigrate调试的相关文章

django 数据库迁移

一,简单的数据导出与导入(简单的迁移) 1. django 项目提供了一个导出的方法 python manage.py dumpdata, 不指定 appname 时默认为导出所有的app 1 python manage.py dumpdata [appname] > appname_data.json 比如我们有一个项目叫 mysite, 里面有一个 app 叫 blog ,我们想导出 blog 的所有数据 1 python manage.py dumpdata blog > blog_du

【Django】依赖auth.user的数据库迁移,以及admin用户非交互式创建

admin用户非交互式创建: echo "from django.contrib.auth.models import User; User.objects.create_superuser('myadmin', '[email protected]', 'hunter2')" | python manage.py shell 依赖auth.user的数据库迁移: python manage.py migrate auth python manage.py migrate 参考资料:

关于Django中ORM数据库迁移的配置

Django中ORM数据库迁移配置 1,若想将模型转为mysql数据库中的表,需要在settings中配置: DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'NAME':'bms', # 要连接的数据库,连接前需要创建好 'USER':'root', # 连接数据库的用户名 'PASSWORD':'', # 连接数据库的密码 'HOST':'127.0.0.1', # 连接主机,默认本级 'PORT':3306

Django链接MySQL,数据库迁移

form表单默认是以get请求提交数据的 http://127.0.0.1:8000/login/?username=admin&password=123 action 1 不写,默认向当前地址提交数据 2 全路径 3 后缀(/index) 提交post请求的时候,需要先去配置文件中注释掉一行 MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.Se

Django数据库设置

设置数据库,创建您的第一个模型,得到一个简单介绍 Django的自动生成管理网站. 数据库设置 现在,打开 mysite / settings.py . 这是一个普通的Python模块 模块级变量代表Django设置. 默认情况下,配置使用SQLite. 如果你是新数据库,或 你只是在Django感兴趣,这是最简单的选择. SQLite是 包括在Python中,所以你不需要安装其他的支持你 数据库. 在开始你的第一个真实的项目,然而,你可能想要使用一个 更健壮的数据库如PostgreSQL,避免

(转)Django 数据库

转:https://blog.csdn.net/ayhan_huang/article/details/77575186 一.数据库框架 数据库框架是数据库的抽象层,也称为对象关系映射(Object-Relational Mapper, ORM),它将高层的面向对象操作转换成低层的数据库指令,比起直接操作数据库引擎,ORM极大的提高了易用性.这种转换会带来一定的性能损耗,但ORM对生产效率的提升远远超过这一丁点儿性能降低. Django中内置的SQLAlchemy ORM就是一个很好的数据库框架

django数据库配置及模型创建,激活

<<<数据库的连接配置>>> django配置mysql的流程: 1.创建数据库用户 (1)进入MySQL数据库    (2)创建有数据库权限的用户 (3)退出MySQL后再进入刚才创建的用户 (4)创建一个数据库  2.配置settings  找到DATABASES,做以下修改 3.修改项目目录(*含settings.py目录)下的__init__.py模块   import pymysql   pymysql.install_as_MySQLdb()   4.设置时

django数据库读写分离,分库

读写分离 在settings中配置不同名称的数据库连接参数,并配置一条数据库选择路由 DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), }, 'db1': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db1.sqlite

Django数据库补充之事务

往数据库写入数据时,如果写入了不完整的数据,我们称之为脏数据.事务管理(transaction)可以防止这种情况发生.事务管理一旦监测到写入异常,会执行回滚操作,即要么写入完整的数据,要么不写入.在Django中使用事务很简单,我们来测试一下: 新建项目Transaction,创建应用app01,编辑models创建两张表并执行数据库迁移,如下: from django.db import models class UserInfo(models.Model): username = model