Pycharm開發(fā)Django項目ORM模型遷移

ORM模型遷移

遷移命令:

makemigrations:將模型生成遷移腳本。模型所在的app,必須放在settings.py中的INSTALLED_APPS中。這個命令有以下幾個常用選項:

app_label:后面可以跟一個或者多個app,那么就只會針對這幾個app生成遷移腳本。如果沒有任何的app_label昨忆,那么會檢查INSTALLED_APPS中所有的app下的模型,針對每一個app都生成響應的遷移腳本杉允。

--name:給這個遷移腳本指定一個名字邑贴。

--empty:生成一個空的遷移腳本。如果你想寫自己的遷移腳本夺颤,可以使用這個命令來實現(xiàn)一個空的文件痢缎,然后自己再在文件中寫遷移腳本。

migrate:將新生成的遷移腳本世澜。映射到數(shù)據(jù)庫中独旷。創(chuàng)建新的表或者修改表的結構。以下一些常用的選項:

app_label:將某個app下的遷移腳本映射到數(shù)據(jù)庫中寥裂。如果沒有指定嵌洼,那么會將所有在INSTALLED_APPS中的app下的模型都映射到數(shù)據(jù)庫中。

app_label migrationname:將某個app下指定名字的migration文件映射到數(shù)據(jù)庫中封恰。

--fake:可以將指定的遷移腳本名字添加到數(shù)據(jù)庫中麻养。但是并不會把遷移腳本轉換為SQL語句,修改數(shù)據(jù)庫中的表诺舔。

--fake-initial:將第一次生成的遷移文件版本號記錄在數(shù)據(jù)庫中鳖昌。但并不會真正的執(zhí)行遷移腳本。

showmigrations:查看某個app下的遷移文件低飒。如果后面沒有app许昨,那么將查看INSTALLED_APPS中所有的遷移文件。

sqlmigrate:查看某個遷移文件在映射到數(shù)據(jù)庫中的時候褥赊,轉換的SQL語句糕档。

migrations中的遷移版本和數(shù)據(jù)庫中的遷移版本對不上怎么辦?

找到哪里不一致拌喉,然后使用python manage.py --fake [版本名字]速那,將這個版本標記為已經映射俐银。

刪除指定app下migrations和數(shù)據(jù)庫表django_migrations中和這個app相關的版本號,然后將模型中的字段和數(shù)據(jù)庫中的字段保持一致端仰,再使用命令python manage.py makemigrations重新生成一個初始化的遷移腳本捶惜,之后再使用命令python manage.py makemigrations --fake-initial來將這個初始化的遷移腳本標記為已經映射。以后再修改就沒有問題了荔烧。

更多關于遷移腳本的售躁。請查看官方文檔:https://docs.djangoproject.com/en/2.0/topics/migrations/

根據(jù)已有的表自動生成模型:

在實際開發(fā)中,有些時候可能數(shù)據(jù)庫已經存在了茴晋。如果我們用Django來開發(fā)一個網站,讀取的是之前已經存在的數(shù)據(jù)庫中的數(shù)據(jù)回窘。那么該如何將模型與數(shù)據(jù)庫中的表映射呢诺擅?根據(jù)舊的數(shù)據(jù)庫生成對應的ORM模型,需要以下幾個步驟:

Django給我們提供了一個inspectdb的命令啡直,可以非常方便的將已經存在的表烁涌,自動的生成模型。想要使用inspectdb自動將表生成模型酒觅。首先需要在settings.py中配置好數(shù)據(jù)庫相關信息撮执。不然就找不到數(shù)據(jù)庫。示例代碼如下:

DATABASES = {'default': {'ENGINE':'django.db.backends.mysql','NAME':"migrations_demo",'HOST':'127.0.0.1','PORT':'3306','USER':'root','PASSWORD':'root'} }

比如有以下表:

article表:

tag表:

article_tag表:


front_user表:

那么通過python manage.py inspectdb舷丹,就會將表轉換為模型后的代碼抒钱,顯示在終端:

fromdjango.dbimportmodelsclassArticleArticle(models.Model):title = models.CharField(max_length=100)? content = models.TextField(blank=True, null=True)? create_time = models.DateTimeField(blank=True, null=True)? author = models.ForeignKey('FrontUserFrontuser', models.DO_NOTHING, blank=True, null=True)classMeta:managed =Falsedb_table ='article_article'classArticleArticleTags(models.Model):article = models.ForeignKey(ArticleArticle, models.DO_NOTHING)? tag = models.ForeignKey('ArticleTag', models.DO_NOTHING)classMeta:managed =Falsedb_table ='article_article_tags'unique_together = (('article','tag'),)classArticleTag(models.Model):name = models.CharField(max_length=100)classMeta:managed =Falsedb_table ='article_tag'classFrontUserFrontuser(models.Model):username = models.CharField(max_length=100)? telephone = models.CharField(max_length=11)classMeta:managed =Falsedb_table ='front_user_frontuser'

以上代碼只是顯示在終端。如果想要保存到文件中颜凯。那么可以使用>重定向輸出到指定的文件谋币。比如讓他輸出到models.py文件中。示例命令如下:

python manage.py inspectdb > models.py

以上的命令症概,只能在終端執(zhí)行蕾额,不能在pycharm->Tools->Run manage.py Task...中使用。

如果只是想要轉換一個表為模型彼城。那么可以指定表的名字诅蝶。示例命令如下:

python manage.py inspectdb article_article > models.py

修正模型:新生成的ORM模型有些地方可能不太適合使用。比如模型的名字募壕,表之間的關系等等调炬。那么以下選項還需要重新配置一下:

模型名:自動生成的模型,是根據(jù)表的名字生成的司抱,可能不是你想要的筐眷。這時候模型的名字你可以改成任何你想要的。

模型所屬app:根據(jù)自己的需要习柠,將相應的模型放在對應的app中匀谣。放在同一個app中也是沒有任何問題的照棋。只是不方便管理。

模型外鍵引用:將所有使用ForeignKey的地方武翎,模型引用都改成字符串烈炭。這樣不會產生模型順序的問題。另外宝恶,如果引用的模型已經移動到其他的app中了符隙,那么還要加上這個app的前綴。

讓Django管理模型:將Meta下的managed=False刪掉垫毙,如果保留這個霹疫,那么以后這個模型有任何的修改,使用migrate都不會映射到數(shù)據(jù)庫中综芥。

當有多對多的時候丽蝎,應該也要修正模型。將中間表注視了膀藐,然后使用ManyToManyField來實現(xiàn)多對多屠阻。并且,使用ManyToManyField生成的中間表的名字可能和數(shù)據(jù)庫中那個中間表的名字不一致额各,這時候肯定就不能正常連接了国觉。那么可以通過db_table來指定中間表的名字。示例代碼如下:

classArticle(models.Model):title = models.CharField(max_length=100, blank=True, null=True) content = models.TextField(blank=True, null=True) author = models.ForeignKey('front.User', models.SET_NULL, blank=True, null=True)# 使用ManyToManyField模型到表虾啦,生成的中間表的規(guī)則是:article_tags# 但現(xiàn)在已經存在的表的名字叫做:article_tag# 可以使用db_table麻诀,指定中間表的名字tags = models.ManyToManyField("Tag",db_table='article_tag')classMeta:db_table ='article'

表名:切記不要修改表的名字。不然映射到數(shù)據(jù)庫中缸逃,會發(fā)生找不到對應表的錯誤针饥。

執(zhí)行命令python manage.py makemigrations生成初始化的遷移腳本。方便后面通過ORM來管理表需频。這時候還需要執(zhí)行命令python manage.py migrate --fake-initial丁眼,因為如果不使用--fake-initial,那么會將遷移腳本會映射到數(shù)據(jù)庫中昭殉。這時候遷移腳本會新創(chuàng)建表苞七,而這個表之前是已經存在了的,所以肯定會報錯挪丢。此時我們只要將這個0001-initial的狀態(tài)修改為已經映射蹂风,而不真正執(zhí)行映射,下次再migrate的時候乾蓬,就會忽略他惠啄。

將Django的核心表映射到數(shù)據(jù)庫中:Django中還有一些核心的表也是需要創(chuàng)建的。不然有些功能是用不了的。比如auth相關表撵渡。如果這個數(shù)據(jù)庫之前就是使用Django開發(fā)的融柬,那么這些表就已經存在了∏骶啵可以不用管了粒氧。如果之前這個數(shù)據(jù)庫不是使用Django開發(fā)的,那么應該使用migrate命令將Django中的核心模型映射到數(shù)據(jù)庫中节腐。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末外盯,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子翼雀,更是在濱河造成了極大的恐慌饱苟,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,590評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狼渊,死亡現(xiàn)場離奇詭異掷空,居然都是意外死亡,警方通過查閱死者的電腦和手機囤锉,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,157評論 3 399
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來护锤,“玉大人官地,你說我怎么就攤上這事±优常” “怎么了驱入?”我有些...
    開封第一講書人閱讀 169,301評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長氯析。 經常有香客問我亏较,道長,這世上最難降的妖魔是什么掩缓? 我笑而不...
    開封第一講書人閱讀 60,078評論 1 300
  • 正文 為了忘掉前任雪情,我火速辦了婚禮,結果婚禮上你辣,老公的妹妹穿的比我還像新娘巡通。我一直安慰自己,他們只是感情好舍哄,可當我...
    茶點故事閱讀 69,082評論 6 398
  • 文/花漫 我一把揭開白布宴凉。 她就那樣靜靜地躺著,像睡著了一般表悬。 火紅的嫁衣襯著肌膚如雪弥锄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,682評論 1 312
  • 那天,我揣著相機與錄音籽暇,去河邊找鬼温治。 笑死,一個胖子當著我的面吹牛图仓,可吹牛的內容都是我干的罐盔。 我是一名探鬼主播,決...
    沈念sama閱讀 41,155評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼救崔,長吁一口氣:“原來是場噩夢啊……” “哼惶看!你這毒婦竟也來了?” 一聲冷哼從身側響起六孵,我...
    開封第一講書人閱讀 40,098評論 0 277
  • 序言:老撾萬榮一對情侶失蹤纬黎,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后劫窒,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體本今,經...
    沈念sama閱讀 46,638評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,701評論 3 342
  • 正文 我和宋清朗相戀三年主巍,在試婚紗的時候發(fā)現(xiàn)自己被綠了冠息。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,852評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡孕索,死狀恐怖逛艰,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情搞旭,我是刑警寧澤散怖,帶...
    沈念sama閱讀 36,520評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站肄渗,受9級特大地震影響镇眷,放射性物質發(fā)生泄漏。R本人自食惡果不足惜翎嫡,卻給世界環(huán)境...
    茶點故事閱讀 42,181評論 3 335
  • 文/蒙蒙 一欠动、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧惑申,春花似錦翁垂、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,674評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽橡类。三九已至荆残,卻和暖如春翎承,著一層夾襖步出監(jiān)牢的瞬間橄妆,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,788評論 1 274
  • 我被黑心中介騙來泰國打工祈坠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留害碾,地道東北人。 一個月前我還...
    沈念sama閱讀 49,279評論 3 379
  • 正文 我出身青樓赦拘,卻偏偏與公主長得像慌随,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子躺同,可洞房花燭夜當晚...
    茶點故事閱讀 45,851評論 2 361

推薦閱讀更多精彩內容