SQLALCHEMY是一个不可靠的方案。对于初级开发者而言,并不如SQL语句来得简明。

或者说,我不知道是不是所有的ORM数据库对象映射方案都存在这么一种情况。纯以开发逻辑而言。下述两段代码的结论是一致的:

CODE1 : 正确实现

  partner_name = request.args.get("partner_name")
  site_name = request.args.get("site_name")
  delegation_query = db.session.query(Delegation)
  delegation_query = delegation_query.\
    filter(or_(
      Delegation.grantee_id == partner_id,
      Delegation.grantor_id == partner_id))
  if site_name is not None:
    delegation_query = delegation_query.\
      join(Site, Site.id == Delegation.site_id).\
      filter(Site.name.like('%' + site_name + '%'))
  if partner_name is not None:
    q1 = delegation_query.\
      join(Partner, Partner.id == Delegation.grantee_id).\
      filter(Partner.name.like('%' + partner_name + '%'))
    q2 = delegation_query.\
      join(Partner, Partner.id == Delegation.grantor_id).\
      filter(Partner.name.like('%' + partner_name + '%'))
    delegation_query = q1.union(q2)

CODE2 : 错误实现

  delegation_query = db.session.query(Delegation)
  if partner_name is not None:
    q1 = delegation_query.\
      join(Partner, Partner.id == Delegation.grantee_id).\
      filter(Partner.name.like('%' + partner_name + '%'))
    q2 = delegation_query.\
      join(Partner, Partner.id == Delegation.grantor_id).\
      filter(Partner.name.like('%' + partner_name + '%'))
    delegation_query = q1.union(q2)
  if site_name is not None:
    delegation_query = delegation_query.\
      join(Site, Site.id == Delegation.site_id).\
      filter(Site.name.like('%' + site_name + '%'))
  delegation_query = delegation_query.\
    filter(or_(
      Delegation.grantee_id == partner_id,
      Delegation.grantor_id == partner_id))

另外附上这段代码的实现目标。partner为用户。site为资源。delegation为用户对资源的映射关系。

即:partner表保存用户的信息。site表保存资源信息。delegation表以ID为映射字段保存资源和用户的对应关系。

此处,delegation的作用是,一个用户将自己拥有的资源的权限部分开放给其他用户。

从系统使用者的角度考虑,输入的参数为:用户名称,资源名称。另外一个默认的参数是从登录状态中取得的,当前用户的ID。(查询权限控制)

由于实现模糊匹配的需要。这块的判断逻辑如下:

  1.  当资源名称输入不为空,需要将关系表和资源表进行连接,实现通过名称查询资源。

  2.  当用户名称输入不为空,需要将关系表和用户表进行连接,实现通过名称查询资源。

  3.  为了执行条件2.需要确认关系表和用户表以哪个键进行连接。(由于授权的关系,关系表中有两列外键对应用户表ID。一个是资源所有者,一个是授权的目标用户)

  4.  为了执行条件3.由于部分数据库似乎不支持FULL JOIN。因此采用UNION进行联合查询。

  5.  查询除了上述1-4条件的基本逻辑外,必须满足这个条件:用户或者是具有了使用该资源的权限,或者是该资源的所有者。

从赋值角度考虑,以及过往的使用方法来看。SQLALCHEMY是支持串行操作的。但是CODE1和CODE2生成的SQL语句是不同的。

实际中,CODE2实现的功能,已知在资源名称和用户名称都有输入值的情况下,忽略了资源名称条件,查询了结果。且未知的情况是,是否满足了条件5的设计。

这件事情来看,不论结果是否是我自身代码写法风格的问题。至少这样来看。并不是简单的串联问题。

因此对当前阶段是否应该使用SQLALCHEMY产生了怀疑。至少如果使用ORM类初期,对于ORM封装内部的逻辑不了解的情况下,这件事情是不可靠的。

也许有文档说明这个问题,也许没有。不过至少上述这么一点问题是需要关注的,除此以外,对于ORM编写的SQL的调优,难度会更高。

总不能每次都用print(str(sql))的方式来解决问题吧。虽然这就是学习方法。。。

关于SQLALCHEMY之(一)的更多相关文章

  1. sqlalchemy学习

    sqlalchemy官网API参考 原文作为一个Pythoner,不会SQLAlchemy都不好意思跟同行打招呼! #作者:笑虎 #链接:https://zhuanlan.zhihu.com/p/23 ...

  2. tornado+sqlalchemy+celery,数据库连接消耗在哪里

    随着公司业务的发展,网站的日活数也逐渐增多,以前只需要考虑将所需要的功能实现就行了,当日活越来越大的时候,就需要考虑对服务器的资源使用消耗情况有一个清楚的认知.     最近老是发现数据库的连接数如果 ...

  3. 冰冻三尺非一日之寒-mysql(orm/sqlalchemy)

    第十二章  mysql ORM介绍    2.sqlalchemy基本使用 ORM介绍: orm英文全称object relational mapping,就是对象映射关系程序,简单来说我们类似pyt ...

  4. Python 【第六章】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度 ...

  5. SQLAlchemy(一)

    说明 SQLAlchemy只是一个翻译的过程,我们通过类来操作数据库,他会将我们的对应数据转换成SQL语句. 运用ORM创建表 #!/usr/bin/env python #! -*- coding: ...

  6. sqlalchemy(二)高级用法

    sqlalchemy(二)高级用法 本文将介绍sqlalchemy的高级用法. 外键以及relationship 首先创建数据库,在这里一个user对应多个address,因此需要在address上增 ...

  7. sqlalchemy(一)基本操作

    sqlalchemy(一)基本操作 sqlalchemy采用简单的Python语言,为高效和高性能的数据库访问设计,实现了完整的企业级持久模型. 安装 需要安装MySQLdb pip install ...

  8. python SQLAlchemy

    这里我们记录几个python SQLAlchemy的使用例子: 如何对一个字段进行自增操作 user = session.query(User).with_lockmode('update').get ...

  9. Python-12-MySQL & sqlalchemy ORM

    MySQL MySQL相关文章这里不在赘述,想了解的点击下面的链接: >> MySQL安装 >> 数据库介绍 && MySQL基本使用 >> MyS ...

  10. 20.Python笔记之SqlAlchemy使用

    Date:2016-03-27 Title:20.Python笔记之SqlAlchemy使用 Tags:python Category:Python 作者:刘耀 博客:www.liuyao.me 一. ...

随机推荐

  1. GitLab搭建详细过程

    一.前提 系统:Centos 6.5 软件版本:gitlab-7.8.4 Selinux:关闭 防火墙规则:先清空(搭建好了后续自己添加相关放行规则) 二.yum源配置和相关依赖包 1.添加epel源 ...

  2. 基础拾遗----RabbitMQ(含封装类库源码)

    基础拾遗 基础拾遗------特性详解 基础拾遗------webservice详解 基础拾遗------redis详解 基础拾遗------反射详解 基础拾遗------委托详解 基础拾遗----- ...

  3. 0e开头MD5值小结

    s878926199a 0e545993274517709034328855841020 s155964671a 0e342768416822451524974117254469 s214587387 ...

  4. laravel webpack填坑(陆续更)

    ie Promise支持需引入babel-polyfill, 在官方文档中js函数介绍有点少导致按babel-polyfill官方引入时找不到北 //webpack.mix.jsmix.js(['no ...

  5. lumen 中间件详解

    我来给大家,讲解一下lumen中的中间件,高手勿喷. 首先,我们看下lumen中文档中的写法,我这里看的是5.3中文文档.https://lumen.laravel-china.org/docs/5. ...

  6. 后台工作者HangFire与ABP框架Abp.Hangfire及扩展

    HangFire与Quartz.NET相比主要是HangFire的内置提供集成化的控制台,方便后台查看及监控,对于大家来说,比较方便. HangFire是什么 Hangfire是一个开源框架(.NET ...

  7. 比ngx_http_substitutions_filter_module 更强大的替换模块sregex的replace-filter-nginx-module

    之前写过nginx反代替换的教程(传送门),使用了ngx_http_substitutions_filter_module模块.不过这货只能替换同一行,具有局限性-_-# 现在一个更强大的替换模块来了 ...

  8. 爬起点小说 day01

    先介绍下我自己爬起点小说的思路: 1.爬取所有的类型列表 a.链接存redis中 类型表:novel_list 具体每一种类型:bnovel_all_list(把novel_list和bnovel_l ...

  9. svn 如果遇到an unversioned directory of the same name already exists的解决办法

    svn 如果遇到an unversioned directory of the same name already exists的解决办法 一般这种情况是因为,在一个已经存在的文件夹里做SVN che ...

  10. 图片布局css

    对于平时项目开发中,经常要展示图片.什么水平居中显示,垂直居中显示,水平或垂直居中显示...我们的发际线就是这样往后退的. 接下来要讲的就是对于各种图片布局的css实现(这里针对的是img标签的不会使 ...