上面两章,主要讲基本的配置,今天我们来做一个比较有趣的东西,为每个客户加一个头像图片。如果我们图片保存在自己的服务器,对于服务器要求有点高,每次下载的时候,都会阻塞网络接口,要是1000个人同时访问这张图片,会彻底报废掉整个网络。如果你跟我一样,在小公司,没有自己专业的图片服务器,又想用图片,那就跟我一样,尝试着用七牛吧。这个真的是一款很不错云产品。

  首先,在model里加一个字段,

 # coding:utf-8
from sqlalchemy import create_engine, ForeignKey, Column, Integer, String, Text, DateTime,\
and_, or_, SmallInteger, Float, DECIMAL, desc, asc, Table, join, event
from sqlalchemy.orm import relationship, backref, sessionmaker, scoped_session, aliased, mapper
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.ext.hybrid import hybrid_property, hybrid_method
from sqlalchemy.orm.collections import attribute_mapped_collection
import datetime engine = create_engine("mysql://root:a12345678@127.0.0.1:3306/blog01?charset=utf8", pool_recycle=7200) Base = declarative_base() db_session = scoped_session(sessionmaker(autocommit=False,
autoflush=False,
bind=engine)) Base.query = db_session.query_property() class User(Base):
__tablename__ = 'user' id = Column('id', Integer, primary_key=True)
phone_number = Column('phone_number', String(11), index=True)
password = Column('password', String(30))
nickname = Column('nickname', String(30), index=True, nullable=True)
head_picture = Column('head_picture', String(100), default='')
register_time = Column('register_time', DateTime, index=True, default=datetime.datetime.now) if __name__ == '__main__':
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:a12345678@127.0.0.1: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() NOT NULL AUTO_INCREMENT,
`phone_number` varchar() DEFAULT NULL,
`password` varchar() DEFAULT NULL,
`nickname` varchar() DEFAULT NULL,
`register_time` datetime DEFAULT NULL,
`head_picture` varchar() 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= DEFAULT CHARSET=utf8 |
+-------+----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
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() NOT NULL AUTO_INCREMENT,
`phone_number` varchar() DEFAULT NULL,
`password` varchar() DEFAULT NULL,
`nickname` varchar() DEFAULT NULL,
`register_time` datetime DEFAULT NULL,
`head_picture` varchar() 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= DEFAULT CHARSET=utf8 |
+-------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
row in set (0.00 sec)

看head_picture是不是变成120了,是不是很简单?好了,这一章就介绍到这,下一章,我们介绍如何通过七牛上传图片。

flask开发restful api系列(3)--利用alembic进行数据库更改的更多相关文章

  1. flask开发restful api系列(8)-再谈项目结构

    上一章,我们讲到,怎么用蓝图建造一个好的项目,今天我们继续深入.上一章中,我们所有的接口都写在view.py中,如果几十个,还稍微好管理一点,假如上百个,上千个,怎么找?所有接口堆在一起就显得杂乱无章 ...

  2. flask开发restful api系列(2)

    继续上一章所讲,上一章我们最后面说道,虽然这个是很小的程序,但还有好几个要优化的地方.先复制一下老的view.py代码. # coding:utf-8 from flask import Flask, ...

  3. flask开发restful api系列(1)

    在此之前,向大家说明的是,我们整个框架用的是flask + sqlalchemy + redis.如果没有开发过web,还是先去学习一下,这边只是介绍如果从开发web转换到开发移动端.如果flask还 ...

  4. flask开发restful api系列(7)-蓝图与项目结构

    如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restful api的最明显效果就是版本控制:而 ...

  5. flask开发restful api系列(6)-配置文件

    任何一个好的程序,配置文件必不可少,而且非常重要.配置文件里存储了连接数据库,redis的用户密码,不允许有任何闪失.要有灵活性,用户可以自己配置:生产环境和开发环境要分开,最好能简单的修改一个东西, ...

  6. flask开发restful api系列(4)--七牛图片服务

    上一章我们讲到如何利用alembic来更新数据库,这章,我们讲如何通过七牛服务来存储图片. 像我们大多数公司一样,公司资金比较少,如果自己开发图片服务器,代价太大:如果我们用自己的网站服务器来保存图片 ...

  7. flask开发restful api系列(5)-短信验证码

    我们现在开发app,注册用户的时候,不再像web一样,发送到个人邮箱了,毕竟个人邮箱在移动端填写验证都很麻烦,一般都采用短信验证码的方式.今天我们就讲讲这方面的内容. 首先,先找一个平台吧.我们公司找 ...

  8. flask开发restful api

    flask开发restful api 如果有几个原因可以让你爱上flask这个极其灵活的库,我想蓝图绝对应该算上一个,部署蓝图以后,你会发现整个程序结构非常清晰,模块之间相互不影响.蓝图对restfu ...

  9. 描述怎样通过flask+redis+sqlalchemy等工具,开发restful api

    flask开发restful api系列(8)-再谈项目结构 摘要: 进一步介绍flask的项目结构,使整个项目结构一目了然.阅读全文 posted @ 2016-06-06 13:54 月儿弯弯02 ...

随机推荐

  1. VS2010安装项目的系统必备中添加.NET 2.0

    把DotNetFX.rar解压后的DotNetFX文件夹,放置于安装了 VS2010 的 C:\Program Files\Microsoft SDKs\Windows\v7.0A\Bootstrap ...

  2. Android上传文件之FTP

    android客户端实现FTP文件(包括图片)上传应该没什么难度.写下来就了为了记录一下,望能帮到新手. 需要用到 commons-net-3.0.1.jar,后面附上jar包. 直接上代码: /** ...

  3. QT 让窗口(或控件)居中

    代码如下: XXX::XXX(QWidget *parent /* = 0 */) { .................. //注意,resize一定要放在这段代码的前面 resize(300, 3 ...

  4. 【HDOJ】1513 Palindrome

    DP,MLE后改为滚动数组AC. #include <cstdio> #include <cstring> #include <cstdlib> #define M ...

  5. 【转】C++动态创建二维数组,二维数组指针

    原作者博客:蒋国宝的IT技术博客 今天完成一道题目需要自己用指针创建一个二维的数组,不得不承认指针的确是恶心. int **result; ; ; result = new int*[row]; ; ...

  6. [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX

    [北京周六见]10 家创业公司联合招 Partner-均融资 1 到 3 轮-薪酬股权可观-本周六举行欢迎来坐坐吃喝谈天 - V2EX [北京周六见]10 家创业公司联合招 Partner-均融资 1 ...

  7. Oracle 表分析

    ANALYZE TABLE SeikyuTbl COMPUTE Statistics FOR TABLE FOR ALL COLUMNS FOR ALL INDEXES ; 一.优化器的优化方式 Or ...

  8. 电脑上已经安装mysql之后安装wamp,wamp中的mysql无法启动的解决办法

    Wampserver安装完成后无法启动MySQL这有可能是你之前安装过MysqL,因为wampserver内置MySQL.解决的方法就是配置环境变量. 找到我的电脑或计算机右键,打开属性,然后打开高级 ...

  9. Java继承与清理

    [程序实例] import java.util.*; class Characteristic { private String s; Characteristic(String s) { this. ...

  10. JS(四)

    JS的属性好多,方法好多,一下子塞进来真的需要时间消化,很多东西都是当时记得很清楚,但忘得很快,看来需要经常去复习,主要是感觉后面一点的练习题好像少了点,所以就显得不是很熟练. 1.About Tim ...