上面兩章,主要講基本的配置,今天我們來做一個比較有趣的東西,為每個客戶加一個頭像圖片。如果我們圖片保存在自己的伺服器,對於伺服器要求有點高,每次下載的時候,都會阻塞網路介面,要是1000個人同時訪問這張圖片,會徹底報廢掉整個網路。如果你跟我一樣,在小公司,沒有自己專業的圖片伺服器,又想用圖片,那就跟 ...
上面兩章,主要講基本的配置,今天我們來做一個比較有趣的東西,為每個客戶加一個頭像圖片。如果我們圖片保存在自己的伺服器,對於伺服器要求有點高,每次下載的時候,都會阻塞網路介面,要是1000個人同時訪問這張圖片,會徹底報廢掉整個網路。如果你跟我一樣,在小公司,沒有自己專業的圖片伺服器,又想用圖片,那就跟我一樣,嘗試著用七牛吧。這個真的是一款很不錯雲產品。
首先,在model裡加一個欄位,
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:[email protected]: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就可以了。
先在blog01目錄下,
alembic init my_migration
這時候,會生成my_migration目錄,這時候目錄如下:
這時候編輯一下alembic.ini,這是alembic的配置文件,基本只要修改一處就可以了。
sqlalchemy.url = mysql://root:[email protected]:3306/blog01?charset=utf8
其實就是告訴alembic,我每次修改的時候,你去動哪個資料庫
接下來就是程式,alembic的腳本是放在env.py裡面,其實也只是要修改一處,就是告訴alembic,我對應的orm用的是哪個引擎。
按照正常情況下,我們只要加兩行代碼就夠了,按照理想狀況應該是這樣
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了,是不是很簡單?好了,這一章就介紹到這,下一章,我們介紹如何通過七牛上傳圖片。