🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2901閲覧

DjangoでMYSQLで直接テーブル作ったあとのマイグレーションでエラー

jomaboy

総合スコア4

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/10/27 06:41

プログラミング初心者です。うまく質問できないのですがよろしくお願いします。

ターミナルを使ってmysqlでテーブルを作成した後、djangoのmodels.pyでクラスと変数を書き、マイグレーションをしたら、django.db.utils.OperationalError: (1050, "Table 'station' already exists")とエラーが出ました。
どうすれば、マイグレーションできるでしょうか?
あとそもそも普通はモデルでテーブルをつくってマイグレーションでデータベースに反映させますが、ターミナルで直接テーブル作成→モデルを作るというやりかたで誤差なくできるのでしょうか?

models

1from django.db import models 2 3# Create your models here. 4class ticket_gate(models.Model): 5 class Meta: 6 db_table = 'ticket_gate' 7 8 id = models.IntegerField(primary_key=True) 9 name = models.CharField(max_length=255) 10 11 def __str__(self): 12 return self.name 13 14class station(models.Model): 15 class Meta: 16 db_table = 'station' 17 18 id = models.IntegerField(primary_key=True) 19 name = models.CharField(max_length=255) 20 ticket_gates = models.ManyToManyField(ticket_gate, verbose_name='改札口') 21 22 def __str__(self): 23 return self.name 24 25 26class cafe_info(models.Model): 27 class Meta: 28 db_table = 'cafe_info' 29 app_label = 'cafelog' 30 31 id = models.IntegerField(primary_key=True) 32 name = models.CharField(max_length=255) 33 created_at = models.DateTimeField(auto_now_add = True) 34 chain_id = models.IntegerField(default=0) 35 updated_at = models.DateTimeField(auto_now = True) 36 stations = models.ManyToManyField(station, verbose_name='最寄駅') 37 ticket_gates = models.ManyToManyField(ticket_gate, verbose_name='改札口') 38 def __str__(self): 39 return self.name 40 41class chain(models.Model): 42 class Meta: 43 db_table = 'chain' 44 45 id = models.IntegerField(primary_key=True) 46 cafe_info = models.OneToOneField(cafe_info, verbose_name='カフェ情報', 47 on_delete=models.CASCADE) 48 name = models.CharField(max_length=255) 49 50 def __str__(self): 51 return self.name 52 53class train_line(models.Model): 54 class Meta: 55 db_table = 'train_line' 56 57 id = models.IntegerField(primary_key=True) 58 name = models.CharField(max_length=255) 59 stations = models.ManyToManyField(station, verbose_name='最寄駅') 60 61 def __str__(self): 62 return self.name 63 64 65 66 67

sql

1# create database nomad; 2 3 4drop table if exists cafe_info; 5 6create table if not exists cafe_info( 7 id int(11) primary key auto_increment, 8 name varchar(255) not null, 9 chain_id int(11) not null default '0', 10 created_at datetime not null default current_timestamp, 11 updated_at datetime not null default current_timestamp on update current_timestamp 12 foreign key fk_chain (chain_id) references chain(id) 13); 14 15insert into cafe_info (id, name, chain_id, created_at) values 16 (30, 'マクドナルド南新宿店', 12,'2019-09-11 10:00:00'), 17 (31, 'ドトール新宿南口店', 2, '2019-09-11 11:00:00'), 18 (32, '但馬珈琲店新宿南口店', 25, '2019-09-11 11:30:00'); 19 20 21drop table if exists chain; 22 23create table if not exists chain( 24 id int(11) primary key auto_increment, 25 name varchar(255) not null 26 ); 27 28 29insert into chain (name) values 30 ("スターバックス"), 31 ("ドトール"), 32 ("タリーズ"), 33 ("エクセシオール"), 34 ("ルノアール"), 35 ("ミヤマカフェ"), 36 ("ベローチェ"), 37 ("上島珈琲店"), 38 ("猿田彦珈琲店"), 39 ("星乃珈琲店"), 40 ("コメダ珈琲店"), 41 ("マクドナルド"), 42 ("モスバーガー"), 43 ("ファーストキッチン"), 44 ("バーガーキング"), 45 ("ケンタッキー"), 46 ("デニーズ"), 47 ("ジョナサン"), 48 ("ロイヤルホスト"), 49 ("ガスト"), 50 ("バグース"), 51 ("TSUTAYA"), 52 ("サンマルク"), 53 ("プロント"), 54 ("但馬珈琲店"), 55 ("びっくりドンキー"), 56 ("ロッテリア"), 57 ("珈琲西武"), 58 ("ピース"), 59 ("バーミアン"), 60 ("ミスタードーナツ"), 61 ("集"), 62 ("カフェ ド クリエ"), 63 ("椿屋カフェ"), 64 ("セガフレード"); 65 66drop table if exists train_line; 67 68create table if not exists train_line( 69 id int(11) primary key auto_increment, 70 name varchar(255) not null 71 ); 72 73insert into train_line (name) values 74 ("山手線"), 75 ("JR埼京線"), 76 ("JRりんかい線"), 77 ("JR川越線"), 78 ("JR中央本線"), 79 ("JR総武本線"), 80 ("JR湘南新宿ライン"), 81 ("JR東海道本線"), 82 ("JR宇都宮線〔東北本線〕・JR上野東京ライン"), 83 ("京王線"), 84 ("京王新線"), 85 ("小田急小田原線/小田急江ノ島線"), 86 ("東京メトロ丸ノ内線"), 87 ("都営大江戸線(環状部)/都営大江戸線(放射部)"), 88 ("都営新宿線"); 89 90drop table if exists station; 91 92create table if not exists station( 93 id int(11) primary key auto_increment, 94 name varchar(255) not null 95 ); 96 97 98insert into station (name) values 99 ("新宿"), 100 ("新宿三丁目"), 101 ("新宿御苑前"), 102 ("渋谷"), 103 ("池袋"), 104 ("西新宿"), 105 ("西新宿五丁目"); 106 107drop table if exists ticket_gate; 108 109create table if not exists ticket_gate( 110 id int(11) primary key auto_increment, 111 name varchar(255) not null 112 ); 113 114insert into ticket_gate (name) values 115 ("南口"), 116 ("新南口"), 117 ("東口"), 118 ("西口"), 119 ("東南口"); 120 121drop table if exists train_line_station; 122 123create table if not exists train_line_station( 124 id int(11) primary key auto_increment, 125 train_line_id int(11) not null default '0', 126 station_id int(11) not null default '0', 127 foreign key fk_train_line (train_line_id) references train_line(id), 128 foreign key fk_station (station_id) references station(id) 129 ); 130 131drop table if exists cafe_info_station; 132 133create table if not exists cafe_info_station ( 134 id int(11) primary key auto_increment, 135 cafe_info_id int(11) not null default '0', 136 station_id int(11) not null default '0', 137 foreign key fk_cafe_info (cafe_info_id) references cafe_info(id), 138 foreign key fk_station (station_id) references station(id) 139 ); 140 141 142 143drop table if exists cafe_info_ticket_gate; 144 145create table if not exists cafe_info_ticket_gate ( 146 id int(11) primary key auto_increment, 147 cafe_info_id int(11) not null default '0', 148 ticket_gate_id int(11) not null default '0', 149 foreign key fk_cafe_info (cafe_info_id) references cafe_info(id), 150 foreign key fk_ticket_gate (ticket_gate_id) references ticket_gate(id) 151 ); 152 153drop table if exists station_ticket_gate; 154 155create table if not exists station_ticket_gate ( 156 id int(11) primary key auto_increment, 157 station_id int(11) not null default '0', 158 ticket_gate_id int(11) not null default '0', 159 foreign key fk_station (station_id) references station(id), 160 foreign key fk_ticket_gate (ticket_gate_id) references ticket_gate(id) 161 );

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Orlofsky

2019/10/27 12:55

INSERT が追加されましたね。SQLでは文字列はシングルクォーティングするのが正式なやり方なのでこの書き込みを見た人が誤って認識されないように直されては?
Orlofsky

2019/10/27 13:05

cafe_info の name は店舗名だけにするべきでは? chain テーブルをchain_id から chain.name を取得します。 station テーブルには 路線IDと駅IDが、ticket_gate テーブルには 路線IDと駅IDが必要かと。 だから、単純に auto_increment で INSERT できるのは親テーブルだけかと。
jomaboy

2019/10/27 13:17

すみません。cafe_info の name は店舗名だけにするべきでは?という意味が理解できません
guest

回答2

0

「ターミナルで直接テーブル作成→モデルを作るというやりかた」
これはできないかと思います。
と言うのは、Djangoはデータベース定義も含めて丸ごと管理するWebアプリケーションですので、models.pyは常に参照される為です。

マイグレーションのエラーについてですが、DBファイル自体を別でコピーしたりしていませんか?
エラ〜メッセージで調べたら、下記サイトが参考になるのではないでしょうか?
https://qiita.com/ajitama/items/130b2f31abd855937a93

投稿2019/10/28 22:07

ak_suzuki

総合スコア194

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

0

外部キーが設定さえれているから、外部参照されているテーブルをDROP TABLE できなかったのでしょう。

SQL

1create table if not exists cafe_info_station ( 2... 3 foreign key fk_station (station_id) references station(id) 4 -- 制約名はどの外部参照かわかるようにユニークにしておいた方が良いです。 5... 6create table if not exists station_ticket_gate ( 7... 8 foreign key fk_station (station_id) references station(id), 9 -- 制約名はどの外部参照かわかるようにユニークにしておいた方が良いです。 10...

外部キーをDROPしてから、子テーブル(外部参照しているテーブル)をDROP TABLE, 親テーブルをDROP TABLE の順に実行しては?

投稿2019/10/27 07:14

Orlofsky

総合スコア16417

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

jomaboy

2019/10/27 10:41 編集

外部キー制約を設定したままにしたいのですが、厳しいのでしょうか?
Orlofsky

2019/10/27 10:45

既にテーブルが存在するなら、DROP TABLE/CREATE TABLEしなければ良いことでは?
jomaboy

2019/10/27 10:50

mysql文ですでにテーブルを作成した場合マイグレーションする必要はないということでしょうか?
Orlofsky

2019/10/27 11:17

試してみては? データベースのテーブルって一度 CREATE TABLE したら、そのテーブルが不要になるまで 何年も使い続けます。(一時表は除く) どうしても DROP TABLE/CREATE TABLE したければ子テーブルから先に DROP TABLE。CREATE TABLE は親テーブルから実行してみては?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問