背景描述:
最近在使用 flask 开发一个小的 web 项目,开始的时候为了方便,使用 sqlite 数据库,现在功能基本开发完成,开始切换到 Mysql 数据库,发现几个 SQLAlchemy 的坑,分享出来供大家参考。
1 、连接坑
相信这个是最早遇到的,连接语句要写成下面这样,记得添加“ pymysql ”这个字段
SQLALCHEMY_DATABASE_URI = "mysql+pymysql://username:password@127.0.0.1:3306/database"
2 、自动创建数据库的坑
使用 ORM 自动创建数据表时,出现: MySQL Error Number 1005 Can ’ t create table ( Errno : 150 )这个错误,经过 的搜索资料,问题得到解决,此问题不外乎这几种情况。
解决方法见我的博客:
http://www.cnblogs.com/StitchSun/p/5386291.html3 、 Sqlite 和 Mysql 内置函数不同
sqlite 内置了日期格式处理函数 strftime ,而 Mysql 确没有这个函数,导致原来在 sqlite 上调试通过的查询要重新编写。
Mysql 内置的函数是 DATE_FORMAT 。
这两个函数都可以通过
db.func.xxx 调用。我想一套代码搞定,调试了半天终于找到了解决方法。
strftime 和 DATE_FORMAT 的使用方法基本一样,但是两个参数的位置是对换的,即
strftime ( format , datetime ); DATE_FORMAT ( datatime , format )
最终的解决办法是使用了两者通用的
db.func.date 。
我原来的代码是这样的:
功能是查询每天的版本数量。
D.query.with_entities(
db.func.strftime('%Y.%m.%d', D.timestamp).label('date'),
db.func.count(D.bug_id).label('total')).filter(
D.version == “参数”).group_by(
db.func.strftime('%Y.%m.%d', D.timestamp)).all()
修改后:
all = D.query.with_entities(
db.func.date(D.timestamp).label('date'),
db.func.count(
D.id).label('total')).filter(
D.version == “参数”).group_by(
db.func.date(D.timestamp)).all()
这里的结果还要做一个转换,即要把查询的结果的 date 字段手动的转换为 str ,
即:[str(
s.date for s in all)]
这样可以做到兼容 Mysql 和 Sqlite 两者。
如果大家有更好的方法,请多多指点
这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。
https://www.v2ex.com/t/285727
V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。
V2EX is a community of developers, designers and creative people.