---
slug: "django-テストで-マイグレーションをキャンセルした時-table-already-exists-で止まらないようにする"
title: "Django テストで マイグレーションをキャンセルした時 table already exists で止まらないようにする"
description: "Django Mezzanine Cartridge のテストで マイグレーションをキャンセルした時\nsettingsにこんな感じに書いてやってたのですが、\nManyToManyフィールドの trouth= がらみの問題で、table already exists で create teable が止まってテストができなくなってました。"
url: "https://www.ytyng.com/blog/django-テストで-マイグレーションをキャンセルした時-table-already-exists-で止まらないようにする"
publish_date: "2018-09-27T02:37:03Z"
created: "2018-09-27T02:37:03Z"
updated: "2026-02-26T04:51:01.418Z"
categories: ["Django"]
keywords: ""
featured_image_url: "https://media.ytyng.com/resize/20230812/d1ef645109394433a023a9434a760623.png.webp?width=768"
has_video: false
has_music: false
video_urls: []
music_urls: []
lang: "ja"
---

# Django テストで マイグレーションをキャンセルした時 table already exists で止まらないようにする

<p>Django==1.9.13<br />Mezzanine==4.3.0</p>
<p>Django Mezzanine Cartridge のテストで マイグレーションをキャンセルした時</p>
<p>settingsに</p>
<pre style="background-color: #ffffff; color: #000000; font-family: 'Menlo'; font-size: 9.0pt;"><span style="color: #000080; font-weight: bold;">if </span><span style="color: #008080; font-weight: bold;">'test' </span><span style="color: #000080; font-weight: bold;">in </span>sys.argv:<br />    CAPTCHA_TEST_MODE = <span style="color: #000080; font-weight: bold;">True<br /></span><span style="color: #000080; font-weight: bold;">    </span>DATABASES = {<br />        <span style="color: #008080; font-weight: bold;">'default'</span>: {<br />            <span style="color: #008080; font-weight: bold;">'ENGINE'</span>: <span style="color: #008080; font-weight: bold;">'django.db.backends.sqlite3'</span>,<br />            <span style="color: #008080; font-weight: bold;">'NAME'</span>: <span style="color: #008080; font-weight: bold;">':memory:'</span>,<br />        },<br />    }<br />    DATABASE_ROUTERS = []<br /><br /><span style="color: #008080; font-weight: bold;">    </span><span style="color: #000080; font-weight: bold;">class </span>DisableMigrations(<span style="color: #000080;">object</span>):<br />        <span style="color: #000080; font-weight: bold;">def </span><span style="color: #b200b2;">__contains__</span>(<span style="color: #94558d;">self</span>, item):<br />            <span style="color: #000080; font-weight: bold;">return True<br /></span><span style="color: #000080; font-weight: bold;"><br /></span><span style="color: #000080; font-weight: bold;">        def </span><span style="color: #b200b2;">__getitem__</span>(<span style="color: #94558d;">self</span>, item):<br />            <span style="color: #000080; font-weight: bold;">return </span><span style="color: #008080; font-weight: bold;">'notmigrations'<br /></span><span style="color: #008080; font-weight: bold;"><br /></span><span style="color: #008080; font-weight: bold;">    </span>MIGRATION_MODULES = DisableMigrations()</pre>
<p>こんな感じに書いてやってたのですが、</p>
<p>ManyToManyフィールドの trouth= がらみの問題で、table already exists で create teable が止まってテストができなくなってました。</p>
<p></p>
<p>なので、BaseDatabaseSchemaEditor の CREATE TABLE 文をパッチして CREATE TABLE IF NOT EXISTS にすれば止まらずに実行できます。</p>
<pre style="background-color: #ffffff; color: #000000; font-family: 'Menlo'; font-size: 9.0pt;"><span style="color: #000080; font-weight: bold;">from </span>django.db.backends.sqlite3.schema <span style="color: #000080; font-weight: bold;">import </span>DatabaseSchemaEditor<br /><br /><span style="color: #808080; font-style: italic;"># CREATE TABLE をパッチ<br /></span>DatabaseSchemaEditor.sql_create_table = \<br />    <span style="color: #008080; font-weight: bold;">"CREATE TABLE IF NOT EXISTS %(table)s (</span><span style="color: #660e7a; font-weight: bold;">%(definition)s</span><span style="color: #008080; font-weight: bold;">)"<br /></span>DatabaseSchemaEditor.sql_create_index = \<br />    <span style="color: #008080; font-weight: bold;">"CREATE INDEX IF NOT EXISTS %(name)s ON %(table)s (%(columns)s)%(extra)s"<br /></span>DatabaseSchemaEditor.sql_create_unique = \<br />    <span style="color: #008080; font-weight: bold;">"CREATE UNIQUE INDEX IF NOT EXISTS %(name)s ON %(table)s (%(columns)s)"</span></pre>
<p></p>
<p></p>
<p>django.db.utils.DatabaseErrorWrapper をパッチして、エラーを握りつぶしてもいいかもしれない</p>
