用python(2.7)自定义实现SQL的集合操作
有的时候需要在不同的数据库实例之间做集合操作,这就无法直接使用SQL语句的join,left join了。相同类型的数据库之间虽然也有类似于DBLINK和FEDERATED之类的东西,但一来这些东西不同的数据库之间是不能通用的,还有就是这些都要在数据库服务端上操作的,即使是dba要走这么一个申请流程也是非常麻烦的。所以就想自己写几个常用的:
inner_join:内连接操作,t1 join t2 on t1.col=t2.col,返回连接字段相等的行,方式包括下面的外连接用的都是最简单的nested loop join。
left_join:左连接操作,t1 left join t2 on t1.col=t2.col,返回左边所有的行以及右表中连接字段相等的行,注意的是右边没有的要以NULL填充。
right_join:右连接操作,t1 right join t2 on t1.col=t2.col,和左连接一样,就是左右的位置换了一下。
union_all:两个集合合并。
union:和union_all一样,就是要除去重复的。
代码如下:
#!/usr/local/bin/python
# -*- coding: utf8 -*- '''
Created on 2016年5月23日 @author: PaoloLiu
''' class sql_merge(object):
'''
classdocs
''' def __init__(self):
'''
Constructor
''' def inner_join(self, left_table, right_table, left_join_col, right_join_col): pass new_result = [] for left_row in left_table:
for right_row in right_table: if left_row[left_join_col] == right_row[right_join_col]:
new_row = left_row + right_row
new_result.append(new_row) return new_result def left_join(self, left_table, right_table, left_join_col, right_join_col): pass new_result = [] addnull = None if len(right_table) > 0:
for i in range (1, len(right_table[0])):
addnull = (addnull, None) for left_row in left_table: n = 0 for right_row in right_table: if left_row[left_join_col] == right_row[right_join_col]:
new_row = left_row + right_row
new_result.append(new_row)
else:
n = n + 1 if n == len(right_table):
new_result.append(left_row + addnull)
else:
new_result = left_table return new_result def right_join(self, left_table, right_table, left_join_col, right_join_col):
return self.left_join(right_table, left_table, right_join_col, left_join_col) def union_all(self, left_table, right_table):
return left_table + right_table def union(self, left_table, right_table):
result = self.union_all(left_table, right_table) new_result = [] for row in result:
if row not in new_result:
new_result.append(row) return new_result def order_asc(self, result, col):
result.sort(key=lambda x:x[col])
return result def order_desc(self, result, col):
result.sort(key=lambda x:x[col], reverse=True)
return result def test():
pass left_result = [(1, "aaa"), (2, "bbb"), (3, "ccc"), (6, None), (1, "")]
right_result = [(1, ""), (2, ""), (4, ""), (5, "abc")]
print "left_result=" + str(left_result)
print "right_result=" + str(right_result)
print "==========================================================" sqlmerge = sql_merge() print "inner_join=" + str(sqlmerge.inner_join(left_result, right_result, 0, 0))
print "left_join=" + str(sqlmerge.left_join(left_result, right_result, 0, 0))
print "right_join=" + str(sqlmerge.right_join(left_result, right_result, 0, 0))
print "union_all=" + str(sqlmerge.union_all(left_result, right_result))
print "union=" + str(sqlmerge.union(left_result, right_result))
print "order_asc=" + str(sqlmerge.order_asc(left_result, 0))
print "order_desc=" + str(sqlmerge.order_desc(left_result, 0)) if __name__ == "__main__":
test()
测试记录运行结果:
left_result=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, '')]
right_result=[(1, ''), (2, ''), (4, ''), (5, 'abc')]
==========================================================
inner_join=[(1, 'aaa', 1, ''), (2, 'bbb', 2, ''), (1, '', 1, '')]
left_join=[(1, 'aaa', 1, ''), (2, 'bbb', 2, ''), (3, 'ccc', None, None), (6, None, None, None), (1, '', 1, '')]
right_join=[(1, '', 1, 'aaa'), (1, '', 1, ''), (2, '', 2, 'bbb'), (4, '', None, None), (5, 'abc', None, None)]
union_all=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, ''), (1, ''), (2, ''), (4, ''), (5, 'abc')]
union=[(1, 'aaa'), (2, 'bbb'), (3, 'ccc'), (6, None), (1, ''), (2, ''), (4, ''), (5, 'abc')]
order_asc=[(1, 'aaa'), (1, ''), (2, 'bbb'), (3, 'ccc'), (6, None)]
order_desc=[(6, None), (3, 'ccc'), (2, 'bbb'), (1, 'aaa'), (1, '')]
最后貼一张我认为最能说明SQL JOIN关系的图。还有要注意的是not in子查询是可以用左边从上往下第二个left join所代替的。
用python(2.7)自定义实现SQL的集合操作的更多相关文章
- sql的集合操作
原文转自:http://blog.csdn.net/qsyzb/article/details/12560917 SELECT语句的查询结果是元组的集合,所以多个SELECT语句的结果可进行集合操作. ...
- Python 列表、元组、字典及集合操作详解
一.列表 列表是Python中最基本的数据结构,是最常用的Python数据类型,列表的数据项不需要具有相同的类型 列表是一种有序的集合,可以随时添加和删除其中的元素 列表的索引从0开始 1.创建列表 ...
- python笔记04-----字典、元组、集合操作
1.字典 是一种key-value的数据类型,使用就像字典 无序的因为无下标 创建一个字典: info = { 'stu1':'qq', 'stu2':'ww', 'stu3' ...
- Python学习—数据库篇之SQL补充
一.SQL注入问题 在使用pymysql进行信息查询时,推荐使用传参的方式,禁止使用字符串拼接方式,因为字符串拼接往往会带来sql注入的问题 # -*- coding:utf-8 -*- # auth ...
- Python开发【第一篇】Python基础之自定义模块和内置模块
为什么要有模块,将代码归类.模块,用一砣代码实现了某个功能的代码集合. Python中叫模块,其他语言叫类库. 类似于函数式编程和面向过程编程,函数式编程则完成一个功能,其他代码用来调用即可,提供了代 ...
- Python预编译语句防止SQL注入
这个月太忙,最近不太太平,我的愿望是世界和平! ================================== 今天也在找python的预编译,早上写的sql是拼接来构成的.于是找了2篇文章,还 ...
- python+selenium之自定义封装一个简单的Log类
python+selenium之自定义封装一个简单的Log类 一. 问题分析: 我们需要封装一个简单的日志类,主要有以下内容: 1. 生成的日志文件格式是 年月日时分秒.log 2. 生成的xxx.l ...
- python之django直接执行sql语句
python之django直接执行sql语句 sql = 'select * from stu' info = 模型类.objects.raw(sql)
- python之MySQL学习——防止SQL注入
python之MySQL学习——防止SQL注入 学习了:https://www.cnblogs.com/xiaomingzaixian/p/7126840.html https://www.cnblo ...
随机推荐
- Log4net日志发布到服务器上日志无法写入
log4net在本地执行时候,日志正常写入,但是发布到服务器上的时候,日志就无法正常写入 解决方案: 1.文件权限 在发布到服务器上的时候,可能文件没有写入权限,导致日志无法正常写入 打开IIS 找到 ...
- Timus - 1209 - 1, 10, 100, 1000...
先上题目: 1209. 1, 10, 100, 1000... Time limit: 1.0 secondMemory limit: 64 MB Let's consider an infinite ...
- [bzoj1452][JSOI2009]Count_树状数组
Count bzoj-1452 JSOI-2009 题目大意:请维护一个平面内的数据结构,支持:单点修改,查询矩形内给定权值出现次数. 注释:$1\le n,m\le 300$,$1\le Q \le ...
- SpringBoot中logback.xml使用application.yml中属性
教你如何使用 springProfile 与 springProperty 让你的logback.xml 配置显得更有逼格,当别人还在苦苦挣扎弄logback-{profile}.xml的时候 你一个 ...
- HDU 2457
直接从root遍历扩展DP,当扩展到的字母和字符串字母相同时,不用修改,不同时,要求修改加1 注意不要扩展危险结点. #include <iostream> #include <cs ...
- 关于Java特种兵下冊
<Java特种兵 下冊>这本书一直没出.至上冊出版近1年以来,每周会有非常多小伙伴发私信或邮件问起我下冊出版的事情,纵使眼下有非常多无奈,小胖还是初步决定准备写下冊. 下冊内容(下冊的内容 ...
- expdp impdp 数据库导入导出命令具体解释
一.创建逻辑文件夹,该命令不会在操作系统创建真正的文件夹.最好以system等管理员创建. create directory dpdata1 as 'd:\test\dump'; 二.查看管理理员文件 ...
- leetcode解题文件夹
点击打开链接点击打开链接点击打开链接參考文献:http://blog.csdn.net/lanxu_yy/article/details/17848219 只是本文准备用超链接的方式连接到对应解答页面 ...
- 屏幕測试亮点,新买了一个显示器,使用web简单的測试下了亮点
1,购买了一个新的显示器 趁着双11的时候价格廉价.入手了一个显示器. http://serve.netsh.org/pub/dead_pixel.bin 滚动下就能够换颜色了.把chrome最大化, ...
- Spring JDBC数据库开发
针对数据库操作,Spring框架提供了JdbcTemplate类. 1.Spring JDBC的配置 创建配置文件applicationContext.xml,添加如下代码: <!--配置数据源 ...