flask開發restful api系列(3)--利用alembic進行數據庫更改

  上面兩章,主要講基本的配置,今天咱們來作一個比較有趣的東西,爲每一個客戶加一個頭像圖片。若是咱們圖片保存在本身的服務器,對於服務器要求有點高,每次下載的時候,都會阻塞網絡接口,要是1000我的同時訪問這張圖片,會完全報廢掉整個網絡。若是你跟我同樣,在小公司,沒有本身專業的圖片服務器,又想用圖片,那就跟我同樣,嘗試着用七牛吧。這個真的是一款很不錯雲產品。mysql

  首先,在model里加一個字段,sql

 1 # coding:utf-8
 2 from sqlalchemy import create_engine, ForeignKey, Column, Integer, String, Text, DateTime,\
 3     and_, or_, SmallInteger, Float, DECIMAL, desc, asc, Table, join, event
 4 from sqlalchemy.orm import relationship, backref, sessionmaker, scoped_session, aliased, mapper
 5 from sqlalchemy.ext.declarative import declarative_base
 6 from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
 7 from sqlalchemy.orm.collections import attribute_mapped_collection
 8 import datetime
 9 
10 engine = create_engine("mysql://root:a12345678@127.0.0.1:3306/blog01?charset=utf8", pool_recycle=7200)
11 
12 Base = declarative_base()
13 
14 db_session = scoped_session(sessionmaker(autocommit=False,
15                                          autoflush=False,
16                                          bind=engine))
17 
18 Base.query = db_session.query_property()
19 
20 
21 class User(Base):
22     __tablename__ = 'user'
23 
24     id = Column('id', Integer, primary_key=True)
25     phone_number = Column('phone_number', String(11), index=True)
26     password = Column('password', String(30))
27     nickname = Column('nickname', String(30), index=True, nullable=True)
28     head_picture = Column('head_picture', String(100), default='')
29     register_time = Column('register_time', DateTime, index=True, default=datetime.datetime.now)
30 
31 
32 if __name__ == '__main__':
33     Base.metadata.create_all(engine)

增長好了之後,開始整合數據庫。該怎麼弄呢?flask建議咱們,可使用第三方插件,flask-migrate,其餘它的底層就是用的alembic,既然咱們知道,就能夠直接用alembic。爲何直接用alembic呢?相信你們也看出來了,我這的代碼跟其餘的flask用sqlalchemy不同,不少人都直接用flask-sqlalchemy插件,但我不太喜歡。由於這個會束縛着我,爲何要用flask,就是由於它自由,想怎麼改就怎麼改,之後要是在這個目錄下,寫點腳本,直接引用便可,沒有必要必定要在current_app環境下。這個只是我的喜愛,喜歡用flask-sqlalchemy的能夠繼續使用。數據庫

 

首先安裝alembic,因爲以前安裝過flask-migrate,因此直接使用apt-get install alembic就能夠了。flask

先在blog01目錄下,服務器

alembic init my_migration

這時候,會生成my_migration目錄,這時候目錄以下:網絡

 這時候編輯一下alembic.ini,這是alembic的配置文件,基本只要修改一處就能夠了。session

sqlalchemy.url = mysql://root:a12345678@127.0.0.1:3306/blog01?charset=utf8

其實就是告訴alembic,我每次修改的時候,你去動哪一個數據庫app

接下來就是程序,alembic的腳本是放在env.py裏面,其實也只是要修改一處,就是告訴alembic,我對應的orm用的是哪一個引擎。url

按照正常狀況下,咱們只要加兩行代碼就夠了,按照理想情況應該是這樣spa

from model import Base
target_metadata = Base.metadata

若是咱們僅僅是這樣,會出現導入錯誤,找不到包,它不知道你要怎麼引用包,因此咱們要把當前目錄加入到環境變量中,使之全局可用。

但是仍是導入包錯誤,必定要把頂部的blog01也放在包裏面,代價太大,不如按照標準方式,把全部文件放在app中。

import os
import sys
root = os.path.dirname(__file__) + '/..'
sys.path.append(root)

from model import Base
target_metadata = Base.metadata

而後結構變成這樣。


運行終端,定位到blog01目錄下,

>>alembic revision --autogenerate -m 'add column head_picture'
INFO  [alembic.runtime.migration] Context impl MySQLImpl.
INFO  [alembic.runtime.migration] Will assume non-transactional DDL.
INFO  [alembic.autogenerate.compare] Detected added column 'user.head_picture'
  Generating /home/yudahai/PycharmProjects/blog01/my_migration/versions/9a12387b186_add_column_head_picture.py ... done

生成編輯腳本,

再運行

>>alembic upgrade head

就能夠了,去數據庫看看吧,已經多了一個頭像列了。

這邊要多說一下,alembic能夠增長,刪除列,但對改變列有的不自動支持,須要本身稍微修改一下。下面我作一個試驗,把head_picture從String(100)修改到String(120),首先咱們檢查一下數據庫實際狀況。

mysql> show create table user;
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone_number` varchar(11) DEFAULT NULL,
  `password` varchar(30) DEFAULT NULL,
  `nickname` varchar(30) DEFAULT NULL,
  `register_time` datetime DEFAULT NULL,
  `head_picture` varchar(100) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ix_user_nickname` (`nickname`),
  KEY `ix_user_phone_number` (`phone_number`),
  KEY `ix_user_register_time` (`register_time`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> 

看上面的代碼,head_picture是String(100),若是咱們按照傳統的辦法,alembic是無法修改字段的,官方文檔也介紹了,截取字段類型和修改字段名字,須要本身手寫腳本。不要擔憂,其實很是很是簡單。

首先,仍是把model.py裏面的head_picture修改成120

    head_picture = Column('head_picture', String(120), default='')

而後生成腳本

$ alembic revision --autogenerate -m 'alter column head_picture string120'

會生成這個腳本文件,打開它,看代碼

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    pass
    ### end Alembic commands ###

它什麼都沒寫,這要咱們本身寫的,也很是很是容易。代碼以下。

from sqlalchemy.dialects import mysql

def upgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('user',  'head_picture', sa.String(length=120), existing_type=mysql.VARCHAR(120))
    ### end Alembic commands ###


def downgrade():
    ### commands auto generated by Alembic - please adjust! ###
    op.alter_column('user',  'head_picture', sa.String(length=100), existing_type=mysql.VARCHAR(100))
    ### end Alembic commands ###

看見沒有,若是對mysql稍微熟悉一點,都知道什麼意思,就是直接把varchar(100)換成varchar(120),若是之後降級,再換成varchar(100)。是否是很是簡單,好了,執行這個腳本吧。

$ alembic upgrade head

檢查一下效果

mysql> show create table user;
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Table | Create Table                                                                                                                                                                                                                                                                                                                                                                                                                                                                                  |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| user  | CREATE TABLE `user` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `phone_number` varchar(11) DEFAULT NULL,
  `password` varchar(30) DEFAULT NULL,
  `nickname` varchar(30) DEFAULT NULL,
  `register_time` datetime DEFAULT NULL,
  `head_picture` varchar(120) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `ix_user_nickname` (`nickname`),
  KEY `ix_user_phone_number` (`phone_number`),
  KEY `ix_user_register_time` (`register_time`)
) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

看head_picture是否是變成120了,是否是很簡單?好了,這一章就介紹到這,下一章,咱們介紹如何經過七牛上傳圖片。

相關文章
相關標籤/搜索