用Python写一个SQLBuilder。Java版能够从 http://www.java2s.com/Code/Java/Database-SQL-JDBC/SQLBuilder.htm 看到。

附上代码:

演示样例代码(一):

class SQLDirector:
@classmethod
def buildSQL(cls, builder):
sql = ""
sql += builder.getCommand()
sql += builder.getTable()
sql += builder.getWhat()
sql += builder.getCriteria()
return sql class SQLBuilder:
def __init__(self): pass
def __del__(self): pass def getCommand(self): pass
def getTable(self): pass
def getWhat(self): pass
def getCriteria(self): pass class InsertBuilder(SQLBuilder): def __init__(self):
self._table = ""
self._columnsAndData = dict()
self._criteria = "" def setTable(self, table):
self._table = table def getCommand(self):
return "INSERT INTO " def getTable(self):
return self._table def getWhat(self):
columns = list()
values = list()
what = "" for columnName in self._columnsAndData:
columns.append(columnName)
values.append(self._columnsAndData[columnName]) columns_str = string.join( map(lambda x: str(x), columns), "," )
values_str = string.join( map(lambda x: str(x), values), "," ) what += " ("
what += columns_str
what += ") VALUES ("
what += values_str
what += ") " return what def getCriteria(self):
return "" def addColumnAndData(self, columnName, value):
if value:
self._columnsAndData[columnName] = value def main():
builder = InsertBuilder()
builder.setTable("employees")
builder.addColumnAndData("employee_id", int(221))
builder.addColumnAndData("first_name", "'Shane'")
builder.addColumnAndData("last_name", "'Grinnell'")
builder.addColumnAndData("email", "'al@yahoo.com'") sql = SQLDirector.buildSQL(builder)
print sql if __name__ == '__main__':
main()

更有意思的玩法。

代码演示样例(二):

#!/usr/bin/env python

import string

class SQLDirector:
def __init__(self, builder):
self._builder = builder def construct(self):
self._builder.buildSQL()
return self._builder.getSQL() class SQLBuilder:
def __init__(self): self._sql = ''
def buildSQL(self): return self
def getSQL(self): return self._sql class InsertBuilder(SQLBuilder):
def __init__(self):
self._columns = list()
self._values = list() def buildSQL(self):
columns_str = string.join( map(lambda x: "`%s`" % str(x), self._columns), "," )
values_str = string.join( map(lambda x: "'%s'" % str(x), self._values), "," ) self._sql = "INSERT INTO "
self._sql += self._table
self._sql += " (%s) VALUES (%s) " % (columns_str, values_str) return self def table(self, table):
self._table = table
return self def column(self, columnName, value):
self._columns.append(columnName)
self._values.append(value)
return self def main():
insertBuilder = InsertBuilder()
insertBuilder.table("dt_process") \
.column("attr_key","foo").column("attr_val", "bar") sqlDirector = SQLDirector(insertBuilder)
print sqlDirector.construct() if __name__ == "__main__":
main()

演示样例代码(三):

#!/usr/bin/env python

import string

def main():
insertBuilder = InsertBuilder()
insertBuilder.table("dt_process") \
.column("attr_key","foo").column("attr_val", "bar") sqlDirector = SQLDirector(insertBuilder)
print sqlDirector.construct() createBuilder = CreateBuilder()
createBuilder.table("newTable").ifnotexists() \
.column("id").col_type("INTEGER").col_autoincrement() \
.column("name").col_type("VARCHAR(40)").col_nullable(False).col_default("empty") sqlDirector = SQLDirector(createBuilder)
print sqlDirector.construct() # -----------------------------------------------------------------------------
# Libraries
# ----------------------------------------------------------------------------- class SQLDirector:
def __init__(self, builder):
self._builder = builder def construct(self):
self._builder.buildSQL()
return self._builder.getSQL() class SQLBuilder:
def __init__(self): self._sql = ''
def buildSQL(self): return self
def getSQL(self): return self._sql class CreateBuilder(SQLBuilder):
def __init__(self):
self._columns = list() # item: dict => 'name', 'nullable', 'default'
self._column_context = None
self._table = ""
self._ifnotexists = ""
self._criteria = "" def _map_column(self, column):
sql = ""
if column.has_key('name'): sql += " `%s`"%column['name']
if column.has_key('type'): sql += " %s"%column['type']
if column.has_key('nullable'): sql += "%s"%column['nullable']
if column.has_key('default'): sql += "%s"%column['default']
if column.has_key('auto_increment'): sql += "%s"%column['auto_increment']
return sql def _reduce_column(self, left, right):
return left + ", " + right def buildSQL(self):
columns_str = reduce(self._reduce_column, map( self._map_column, self._columns )) self._sql = "CREATE TABLE "
self._sql += self._ifnotexists
self._sql += self._table
self._sql += " (%s)" % columns_str return self def ifnotexists(self):
self._ifnotexists = " IF NOT EXISTS "
return self def table(self, table):
self._table = table
return self def column(self, columnName):
column = dict()
column['name'] = columnName
self._columns.append(column)
self._column_context = column
return self def col_type(self, type):
self._column_context['type'] = type
return self def col_nullable(self, nullable=True):
if nullable:
self._column_context['nullable'] = ""
else:
self._column_context['nullable'] = " NOT NULL"
return self def col_default(self, default):
self._column_context['default'] = " DEFAULT %s" % default
return self def col_autoincrement(self, autoincrement=True):
self._column_context['auto_increment'] = " AUTO_INCREMENT"
return self def primary(self, primary=True):
self._primary_key.append(self._column_context['name'])
return self #
# INSERT INTO
#
class InsertBuilder(SQLBuilder):
def __init__(self):
self._columns = list()
self._values = list()
self._table = "" def buildSQL(self):
columns_str = string.join( map(lambda x: "`%s`" % str(x), self._columns), "," )
values_str = string.join( map(lambda x: "'%s'" % str(x), self._values), "," ) self._sql = "INSERT INTO "
self._sql += self._table
self._sql += " (%s) VALUES (%s) " % (columns_str, values_str) return self def table(self, table):
self._table = table
return self def column(self, columnName, value):
self._columns.append(columnName)
self._values.append(value)
return self if __name__ == "__main__":
main()

[Python] SQLBuilder 演示样例代码的更多相关文章

  1. java 线程、线程池基本应用演示样例代码回想

    java 线程.线程池基本应用演示样例代码回想 package org.rui.thread; /** * 定义任务 * * @author lenovo * */ public class Lift ...

  2. java文件夹相关操作 演示样例代码

    java文件夹相关操作 演示样例代码 package org.rui.io; import java.io.File; import java.io.FilenameFilter; import ja ...

  3. 10分钟理解Android数据库的创建与使用(附具体解释和演示样例代码)

    1.Android数据库简单介绍. Android系统的framework层集成了Sqlite3数据库.我们知道Sqlite3是一种轻量级的高效存储的数据库. Sqlite数据库具有以下长处: (1) ...

  4. java 又一次抛出异常 相关处理结果演示样例代码

    java 又一次抛出异常 相关处理结果演示样例代码 package org.rui.ExceptionTest; /** * 又一次抛出异常 * 在某些情况下,我们想又一次掷出刚才产生过的违例,特别是 ...

  5. C编程规范, 演示样例代码。

    /*************************************************************** *Copyright (c) 2014,TianYuan *All r ...

  6. java I/O进程控制,重定向 演示样例代码

    java I/O进程控制,重定向 演示样例代码 package org.rui.io.util; import java.io.*; /** * 标准I/O重定向 */ public class Re ...

  7. AppCan移动应用开发平台新增9个超有用插件(内含演示样例代码)

    使用AppCan平台进行移动开发.你所须要具备的是Html5+CSS +JS前端语言基础.此外.Hybrid混合模式应用还需结合原生语言对功能模块进行封装,对于没有原生基础的开发人员,怎样实现App里 ...

  8. Linux下用OTL操作MySql(包含自己封装的类库及演示样例代码下载)

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/ClamReason/article/details/23971805 首先重点推荐介绍otl介绍及使 ...

  9. java 状态模式 解说演示样例代码

    package org.rui.pattern; import junit.framework.*; /** * 为了使同一个方法调用能够产生不同的行为,State 模式在代理(surrogate)的 ...

随机推荐

  1. [笔记]《算法图解》第十章 K最近邻算法

    K最近邻算法 简称KNN,计算与周边邻居的距离的算法,用于创建分类系统.机器学习等. 算法思路:首先特征化(量化) 然后在象限中选取目标点,然后通过目标点与其n个邻居的比较,得出目标的特征. 余弦相似 ...

  2. android AsyncTask使用限制

    由于AsyncTask内部是使用线程池(ThreadPoolExecutor)来管理要处理的任务的,所以AsyncTask的弊端就非常明确了:要extcute的任务数量超过线程池最大容量时,必然会报错 ...

  3. Threadlocal_笔记

    参考:https://www.jianshu.com/p/377bb840802f https://www.cnblogs.com/dreamroute/p/5034726.html ThreadLo ...

  4. BZOJ 4326:NOIP2015 运输计划(二分+差分+lca)

    NOIP2015 运输计划Description公元 2044 年,人类进入了宇宙纪元.L 国有 n 个星球,还有 n−1 条双向航道,每条航道建立在两个星球之间,这 n−1 条航道连通了 L 国的所 ...

  5. java 后台封装json数据学习总结(二)

    一.JSONArray的应用 从json数组中得到相应java数组,如果要获取java数组中的元素,只需要遍历该数组. /* * 从json数组中得到相应java数组 * JSONArray下的toA ...

  6. modulus CRT

    (吐槽)额..CRT本来就是modulus的么.. CRT是可以每次加一个条件的(当然要保证coprime) 那么我们考虑 x=a (mod p1) x=b (mod p2) 这样的话我们知道 x=a ...

  7. JavaScript Array 对象的方法,比如push和unshift

    https://www.runoob.com/jsref/jsref-obj-array.html js数组与字符串的相互转换 一.数组转字符串 需要将数组元素用某个字符连接成字符串,示例代码如下: ...

  8. 【12】react 之 redux(1)

    TodoList小demo 效果展示 项目地址 (单向)数据流 数据流是我们的行为与响应的抽象:使用数据流能帮我们明确了行为对应的响应,这和react的状态可预测的思想是不谋而合的. 常见的数据流框架 ...

  9. O(1)gcd学习笔记

    设最大权值为\(M\) \(T=\sqrt M\) 定理 任意一个\(\le M\)的数一定可以表示为abc三个数的乘积 满足这三个数要么\(\le T\),要么是一个质数 证明: 考虑反证 假设\( ...

  10. 游戏(bzoj 1854)

    Description lxhgww最近迷上了一款游戏,在游戏里,他拥有很多的装备,每种装备都有2个属性,这些属性的值用[1,10000]之间的数表示.当他使用某种装备时,他只能使用该装备的某一个属性 ...