V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python Sites
PyPI - Python Package Index
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
Stitch
V2EX  ›  Python

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

  •  
  •   Stitch · 2016-06-14 19:54:51 +08:00 · 5777 次点击
    这是一个创建于 3084 天前的主题,其中的信息可能已经有所发展或是发生改变。
    背景描述:
    最近在使用 flask 开发一个小的 web 项目,开始的时候为了方便,使用 sqlite 数据库,现在功能基本开发完成,开始切换到 Mysql 数据库,发现几个 SQLAlchemy 的坑,分享出来供大家参考。

    1 、连接坑
    相信这个是最早遇到的,连接语句要写成下面这样,记得添加“ pymysql ”这个字段
    SQLALCHEMY_DATABASE_URI = "mysql+pymysql://username:[email protected]: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 两者。


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

    把链接重新贴下:
    http://www.cnblogs.com/StitchSun/p/5386291.html
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   916 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 31ms · UTC 21:42 · PVG 05:42 · LAX 13:42 · JFK 16:42
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.