Flask-SQLAlchemy 学习

Flask-SQLALchemy 是一个给你的应用添加 SQLALchemy 支持的 Flask 扩展。SQLALchemy 是Python语言的SQL工具包及对象关系映射(ORM)工具,使用MIT许可证发行,提供能兼容众多数据库(如 SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird)的企业级持久性模型。

一、为你的Flask应用加载Flask-SqlAlchemy扩展

Code example:
1
2
3
4
5
6
from flask import Flask
from flask.ext.sqlalchemy import SQLAlchemy
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:////tmp/test.db'
db = SQLAlchemy(app)  #这个就是你以后操作数据库的对象实例了

SQLALCHEMY_DATABASE_URI格式实例:

postgresql://scott:tiger@localhost/mydatabase
mysql://scott:tiger@localhost/mydatabase
oracle://scott:tiger@127.0.0.1:1521/sidname
sqlite:////absolute/path/to/foo.db #注意:有3个斜杠+路径

二、建立数据库模型和初始化数据库

建立数据库模型:

Code example:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import hashlib
from app import db  #在数据库模型文件中导入上面建立的db对象
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True# id
    username = db.Column(db.String(80), unique=True)
    email = db.Column(db.String(320), unique=True)
    password = db.Column(db.String(32), nullable=False)
    def __init__(self, username, email, password):
        self.username = username
        self.email = email
        self.password= hashlib.md5(password)  #呵呵,这样在插入数据自动给密码哈希了!
    def __repr__(self):
        return "<User '{:s}'>".format(self.username)

初始化数据库也特别简单,只需要调用 db.create_all() 函数就可以了。

Code example:
1
2
if __name__ == '__main__':
    db.create_all()

三、插入数据

Code example:
1
2
3
u = User(username='peter', email='test@example.com', password='123456')
db.session.add(u)  #插入数据
db.session.commit()  #只有提交事务了,才可以获取(u.id)数据的ID值。

四、查询数据

用主键获取数据:

Code example:
1
2
User.query.get(1)
<User u'admin'>

通过一个精确参数进行反查:

Code example:
1
2
peter = User.query.filter_by(username='peter').first()  #注意:精确查询函数query.filter_by(),是通过传递参数进行查询;其他增强型查询函数是query.filter(),通过传递表达式进行查询。
print(peter.id#如果数据不存在则返回None

模糊查询:

Code example:
1
2
User.query.filter(User.email.endswith('@example.com')).all()
[<User u'admin'>, <User u'guest'>]

逻辑非1:

Code example:
1
2
peter = User.query.filter(User.username != 'peter').first()
print(peter.id)

逻辑非2:

Code example:
1
2
3
from sqlalchemy import not_
peter = User.query.filter(not_(User.username=='peter')).first()
print(peter.id)

逻辑与:

Code example:
1
2
3
from sqlalchemy import and_
peter = User.query.filter(and_(User.username=='peter', User.email.endswith('@example.com'))).first()
print(peter.id)

逻辑或:

Code example:
1
2
3
from sqlalchemy import or_
peter = User.query.filter(or_(User.username != 'peter', User.email.endswith('@example.com'))).first()
print(peter.id)

六、查询数据加工

排序和限制函数可以跟在query或filter后面。
排序:

Code example:
1
2
User.query.order_by(User.username)  #嘿嘿,你用哪个字段作为排序参考呢?
[<User u'admin'>, <User u'guest'>, <User u'peter'>]

限制返回的数目:

Code example:
1
2
User.query.limit(1).all()
[<User u'admin'>]

六、查询数据返回

返回查询到的第一个对象:

Code example:
1
2
r = User.query.first()
print(r)

返回所有查询到的对象:

Code example:
1
2
r = User.query.all()
print(r)

七、删除数据

Code example:
1
2
3
u = User.query.first()
db.session.delete(u)  #删除数据和插入数据一样简单,但必须是通过查询返回的对象。
db.session.commit()

八、更新数据

Code example:
1
2
3
u = User.query.first()
u.username = 'guest'  #更新数据和变量赋值那么简单,但必须是通过查询返回的对象。
db.session.commit()

ImportError: No module named MySQLdb

ImportError: No module named MySQLdb
该错误是源于我们没有安装Python连接MySQL所需的MySQLdb库而引起。
MySQL是最流行的开源数据库之一,但在Python标准库中并没有集成MySQL接口程序,MySQLdb是一个第三方包,需独立下载并安装。Python连接MySQL的关键之处在于设置数据库连接,在连接成功之后,其实不管后端是何种数据库,对DB-API对象的属性和方法进行操作都是一样的。
下载地址:http://sourceforge.net/projects/mysql-python/
对于Linux来说,有多重包管理系统和安装机制。如果使用的是包含某种包管理器的Linux,那么可以很轻松的安装Python MySQLdb库。
Linux Fedora, CentOS系统:yum install MySQL-python
Linux Ubuntu操作系统:apt-get install python-mysqldb
下面的代码演示了如何创建一个表,插入和访问数据等简单操作:
#!/usr/bin/env python
import MySQLdb
def main():
    print ‘*** Connecting to database’
    cxn=MySQLdb.connect(host=’192.168.1.108′, user=’root’, passwd=’123456′, db=’test’)
    if not cxn:
        print ‘ERROR: connection not supported, exiting’
    return
    cur=cxn.cursor()
    print ‘*** Creating users table’
    cur.execute(‘CREATE TABLE users(login VARCHAR(8), uid INT)’)
    print ‘*** Inserting some users’
    cur.execute(“INSERT INTO users VALUES(‘john’, 7000)”)
    cur.execute(“INSERT INTO users VALUES(‘jane’, 7001)”)
    cur.execute(“INSERT INTO users VALUES(‘bob’, 7200)”)
    print ‘*** Search for users starting with j’
    cur.execute(“SELECT * FROM users WHERE login LIKE ‘j%'”)
    for data in cur.fetchall():
        print ‘%s\t%s’ % data
    cur.close()
    cxn.commit()
    cxn.close()
if __name__ == ‘__main__’:
    main()
我的更多文章:

ionic 基本调用

ionic简介

ionic是一个专注于用WEB开发技术,基于HTML5创建类似于手机平台原生应用的一个开发框架。目前绑定的与angularJS和SASS。这个框架的目的是从web的角度开发手机应用,基于PhoneGap的编译平台,可以实现编译成各个平台的应用程序。

ionic安装

首先需要安装cordova和android环境。这个参考我的另一篇文章:phoneGap之Android环境搭建,上面写的很详细,还有常见的错误及解决办法。
然后安装ionic:

1
npm install -g ionic

安装完成之后,就可以使用ionic创建项目了。

1
ionic start myApp tabs   //创建带有top栏和bottom栏的示例项目
ionic start myApp sidemenu  //创建带有左侧带有menu栏的示例项目
ionic start myApp blank   //创建空白项目

具体效果,可以查看官网: http://ionicframework.com/getting-started/
然后可以使用:

1
ionic serve

该命令会自动启动流浏览器,查看当前效果。

添加Android平台

执行下面的命令,

1
cd myApp
ionic platform add android //这行可能会报错
ionic build android
ionic emulate android

其实上面的使用方法和cordova差不多,添加android的时候可能会报错,如下:

1
The error is:
=======================================
events.js:72
throw er; // Unhandled 'error' event
^
Error: spawn ENOENT
at errnoException (child_process.js:1000:11)
at Process.ChildProcess._handle.onexit (child_process.js:791:34)

解决的方法很简单,将ionic换成cordova即可,经测试works fine。

1
cd myApp
cordova platform add android //这行可能会报错
cordova build android
cordova emulate android

其他常见错误

  1. 生成项目(ionic start myApp tabs)时可能会报错,如下:
    1
    Error: command failed:fatal:could not create work tree dir:'C:\Users/ADMINI~1\AppData\Local\Temp\plugman\git\1402853493773'.:No such file or directory

解决办法:进入上面对应的目录,建立对应的文件。比如在temp目录下建立plugman目录,在plugman目录下建立git目录,然后再git下建立1402853493773目录。即可,经测试有效。

css组件

试想着怎么样把信息告诉其它人

怎么样把信息告诉其它人,至少知道这么一回事,这确实比较难,但是还是想去试试,只是试试:

1、邮件方式,以前社交平台的漏洞让这个事情变得容易的多,首先得到一个校区大部分的QQ(利用QQ很容易得到),然后再得到个人大部分
好友的QQ,接下来的就是发邮件的事,怎么样以百来个(买)的邮箱,轮流发送,发送端邮箱一天可以大概可以达到上千封;
2、短信,得到号码是一个问题,但是12306和汉庭酒店的数据泄漏给了一个很大的帮助,但是大众话的,怎么样得到精确的信息,这就得用网络爬取;
3、社交网络,购买各个SNS平台的号(貌似很便宜),贴吧,社区,QQ群(用软件)发送,SNS营销号互动,整个地区分发,应该多多少少有
点效果,成本应该很低,这倒是普遍常用的方式,显然,这需要一个终端(可以理解为一个人)几十个账号的交换,也很显然,破解的营销
的软件给力很大的方便,网络话术也很给力,要不然,一个女生怎么同时跟两百个人营销;
4、微平台加粉,微信,微博营销加粉软件貌似成熟不少,一键群回复也是常事,一键问候之类的,维护粉就容易多的了,这效果肯定不会短
期出现效果,但是一达到效果感觉应该是深入人心的,毕竟,这是一个送温暖的活,这是基本的运营方式,这也是成本很低的方式;
5、软文处理,这是一个很困难的事情,怎么让一篇文章貌似很有感受,确实有营销效果,想到的一个办法,各大平台的软文太多,修改链接
或是故事内容部分,也许会达到点点效果(只是点点),也许也不是点点,看人品,应该完成不是问题,因为,感动你的,也会感动他,并
不是每个演讲大师身后都一段感人肺腑的经历;
6、地推,这是最实战的方式,也是开始走出去做事的一个开始(只是开始),前面大部分的工作主要为了打舆论(不管大与小),技巧很多
,普遍的送礼(十个里面,总有一两个想要),对外一个产品的理解大概也需要一个月,通过前面的处理方式,很快打入思想理解,地推总
能说个一二三,责任心也就体现了;
7、接下来的,就是用户刺激,事件策划 … (这是一个长期的事情)

尝试的第一步是邮件方式,外发出5000封(机器发送等着就好,一个晚上的时间),得到的PV量是1500,而点击进入的成为用户的为150个左
右 ….

我们是怎样被滴滴打败的 — 个已故打车软件的反思

百米出租车的名字你也许没有听过,但在北京只要跑出租超过两年的司机都会对这个名称很熟悉,北京10万名出租司机中有一半都曾配备过百米提供的专用平板电脑。

百米出租车从推出市场到最终关停只有不到两年时间,至于滴滴快的为什么会成功而我们为什么会失败,公司没有做任何方式的总结,各奔东西的同事们也很少再谈起这个话题。但我对于这个问题思考一直没有停止,在自己创业之初写出这篇文字,一来整理一下自己的思路避免重复走过去的弯路,二来希望能给更多的创业公司一点点借鉴。

初创公司的轻重缓急

首先从百米的出租车专用平板电脑说起吧。在2012年年中项目推出前公司曾做过详细的市场调研,其中一个调研的结论是:90%以上的出租车司机都没有智能手机!正是基于这样的调研数据,百米出租车司机端有自己的定制设备。

后来发生的事情大家也都知道了,出租车司机成了智能设备普及率最高的群体之一,这件事情给我的教训是不要太相信市场调研,因为任何市场调研的数据都是基于过去,而你的产品是面向未来的用户。

正是因为参考了市场调研的结论,百米出租车从一开始就采用了独有的软件+硬件模式:司机端采用7吋的平板电脑,在这个终端上除了承载打车功能外,还搭载了应用市场、视频广告、游戏及出租车公司的管理模块——在当时几乎所有媒体都在质疑打车软件的盈利模式时,百米出租车的盈利模式是最为清晰的。

在百米出租车上线初期,“软+硬”的模式确实起到了积极的作用,司机只需要交300元押金,就能免费领到价值1288元的平板电脑,而且随时可以退还。这样的优惠措施,对出租司机的诱惑是很强的,再加上公司强大的地推能力,在2012年下半年至2013年初那段时间内,百米出租车在北京市场走在了打车软件的前面。

百米最先完成与渔阳,新月,金银建等公司级的合作,也是最早同960103电话叫车平台达成合作的打车软件。但随着业务的进展,这种模式的弊端逐渐显现出来,复杂的系统使得整个技术开发的力量极为分散,面对市场变化的响应速度极慢。

记忆中公司与96103的合作在2013年1月中旬就已经谈定,但与对方的电话叫车数据接入到百米的终端上一直到4月底才完成,而一直到业务停摆,百米出租车的订单都没能接入到对方的平台。要知道96103平台每天上万的订单和数万辆出租车可以同时解决鸡和蛋的问题,这对于早期的O2O项目是多么的珍贵。

而几乎是同期,滴滴同百度地图等达成了的合作,从百度地图客户端上导入的叫车订单,帮助滴滴解决了订单少的燃眉之急,渡过了起步的最困难阶段。

创业公司的资源本来就很有限,更应该把资源集中在核心业务的主流程上来,多一个环节问题就会成倍的增加。

流氓的滴滴

在打车软件起步阶段,大家都在摸索着往前走。但在这个过程中,滴滴的做法更具攻击性。很多同事在评价竞争对手滴滴时,都用到了“流氓”两个字。

在推广的初期,滴滴采用了许多非常规的手段。司机没有智能设备,滴滴的地推会帮着司机刷机,在百米的专用设备上安装上滴滴打车;而同时安装了滴滴和摇摇(国内第一款打车软件)的手机,会弹出提示,引导用户卸载摇摇;在很长一段时间内,滴滴都会向司机端推送假订单,司机虽然抢不到活,但会觉得是自己手慢。很多同事对滴滴的做法都很不屑,但这些确实是很有效的方式。

在竞争对手眼里,滴滴的手段是流氓的,在主管部门的眼里,滴滴却是最不听话的,而百米出租车却是最听话的。

为了杜绝黑车借助打车软件混入出租车阵营,交通委要求打车软件认真核实司机身份,百米出租车认真贯彻执行,司机需持有身份证,服务监督卡原件才能办理业务。而滴滴只需要司机输入真实姓名、出租车公司、服务监督卡号和车牌号码,就可以通过验证。为了体验滴滴的流程,百米的很多同事手机里都安装了滴滴的司机端软件,办公室里不时会想起滴滴的订单呼叫声。

交通委曾三令五申要求打车软件不能采用加价功能,百米是言听计从,加价功能也一直没有列入开发日程,但滴滴却使用加价功能大大提升了乘客打车成功率,司机也因此得到了实惠。在各大应用市场上百米出租车的软件介绍中甚至还明确写到:与大型出租公司合作,杜绝黑车、加价,正规可靠。

产品遇到不确定的政策或其它风险时,创业公司真的没有必要去考虑太多的风险因素,这有可能会让你错失领先的机会。不确定不明朗的市场和政策环境中往往孕育着大的市场机会,而一旦形势明朗,在阳光大道上已经挤满了各色的竞争者。

融资:不缺钱时更好融资

打车软件的市场格局从滴滴和快的的补贴大战开始后就逐渐尘埃落定。但最早开始进行补贴的却是百米出租车。

起初是补贴司机,出租司机推荐一名乘客安装百米出租车App奖励司机10元,推荐一名司机则奖励20元,这样方法确实奏效,司机的积极性很高。后期开始尝试补贴乘客,乘客使用百米出租车成功打车,会得到话费的补贴。

在当时的出租车公司和司机眼里,百米出租车是“财大气粗”的。百米的投资人主业是做地产的,百米出租车在起步阶段就注入了上千万的资金,而滴滴对外称只有80万的启动资金。

在打车软件逐渐走热,各家纷纷融资时,也有不少投资机构找到百米,但当时并不差钱的百米没有重视融资的事情。而在滴滴和快的开始烧钱大战的时候,正赶上房地产陷入低谷,百米的资金链出现了问题。

不缺钱时候也要想办法融资,别等需要更大投入时捉襟见肘,当然除了资金外,资金背后的资源更是创业公司所或缺的。

不缺钱时往往是最容易融到钱的。

后记:吃一堑长一智

有了在百米出租车的教训,在开始一个全新的红包易项目时候,我考虑的是先用最简单的方式去验证业务模式。

拿出业务需求后,产品及研发给出的开发时间需要三个月,我们一起删减掉非核心的功能,部分功能先用人工辅助完成,最后只用了两周多时间就完成了第一个版本。这个版本投向市场测试后,效果并没有达到预期。我们开始从需求审视产品:红包易定位空闲时间变现平台,第一个版本我们希望借助红包达到吸引粉丝、分享和订单转化等功能,可能的问题是功能太多不聚焦。

第二个版本我们聚焦在吸引粉丝一个功能点上,同样用最短的时间内开发完成后再次推向市场,这一次效果出奇的好。试想一下,如果第一个版本花费几个月时间具备“完整”的功能,重新做产品方向的调整时,包袱就会很重,对整个团队的打击会很大,这个产品很可能在一个错误的方向上一直走下去。

最近我面试一个做过拼车项目的产品经理时,他向我展示了1.0版本的产品原型图,其复杂程度让我瞠目结舌,最终的结果是1.0产品还没有开发完成,天使轮的资金就已经花光,项目面临停摆的风险。

很多公司的衰败都是一个温水煮青蛙的过程,清楚记得百米出租车在最后一段时间里,每一个身在其中的同事无论高管还是普通员工,只能眼睁睁的看着百米出租车一步步走向没落,那种牛入泥潭般的无力感至今想起都感觉很可怕。

“如果你要去创业,多花点时间思考别人为什么失败,不要去思考别人为什么成功”马云曾经这样告诫创业者。我知道创业路上还有很多坑等着我去跌倒,错误在所难免,重要的是能够及时发现自己在犯错,并且还能够保留爬起来的体力。