使用 Flask-SQLAlchemy 兼容 Mysql 和 Sqlite 遇到的几个坑

2016-06-14 19:54:51 +08:00
 Stitch
背景描述:
最近在使用 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.html


3 、 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 两者。


如果大家有更好的方法,请多多指点
5779 次点击
所在节点    Python
8 条回复
alexapollo
2016-06-14 19:59:30 +08:00
文章的格式和字符能否统一下,强迫症发作了。。
zhuangzhuang1988
2016-06-14 20:15:26 +08:00
这些不算坑. 数据库本身就各有特性的...
gkiwi
2016-06-14 20:47:27 +08:00
用 django lol
本地开发都是 sqlite ,服务器为 mysql ,暂时没发现问题
t0p10
2016-06-15 09:00:27 +08:00
ncie post
Stitch
2016-06-15 09:41:14 +08:00
@alexapollo 超过时间了,无法编辑了
nellace
2016-06-15 10:55:00 +08:00
博客链接贴错了还是挂了?刚想去学习下
swirling
2016-06-15 13:45:00 +08:00
想起两年前就有这些类似问题,过了两年还有啊。哎。
Stitch
2016-06-15 23:04:29 +08:00
@nellace 刚才查看下,可以打开的

把链接重新贴下:
http://www.cnblogs.com/StitchSun/p/5386291.html

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/285727

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX