用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()

最新文章

  1. git tag使用标记
  2. phoenix将hdfs数据导入hbase
  3. sublime text3 快捷键设置
  4. [ACM_数学] 大菲波数 (hdu oj 1715 ,java 大数)
  5. A股市场各行业龙头股一览表
  6. python安装numpy科学计算模块
  7. #数据结构-fib
  8. 模仿cocos2dx 风格用工厂方法,实现class A,不使用宏,
  9. 嵌入式 hi3518平台以太网网络模块设计包括重连机制和网线检测机制
  10. js Table冻结表头示例代码
  11. 自己定制Linux发行版(资料)
  12. 构建ASP.NET MVC4+EF5+EasyUI+Unity2.x注入的后台管理系统(21)-权限管理系统-跑通整个系统
  13. css.day.05.eg
  14. JDBC、DBCP、C3P0、jdbc-pool--链接方式?连接池?
  15. interface{} 泛型编程
  16. JSON序列——保存修改数据2
  17. vue 拍照上传图片 demo
  18. Java多线程编程模式实战指南(三):Two-phase Termination模式
  19. BZOJ4332 JSOI2012 分零食 【倍增 + NTT】
  20. 一张图看懂Mysql的join连接

热门文章

  1. 微信小程序--问题汇总及详解之picker 增、删
  2. 最简单的动态代理实例(spring基于接口代理的AOP原理)
  3. linux系统——日志文件系统及性能分析
  4. Linux服务器重启后nvidia-smi无法使用的解决方法
  5. unbuntu 矫正电脑系统时间
  6. android的布局-----TableLayout(表格布局)
  7. css命名推荐
  8. 反射$change属性问题
  9. javascript 动态添加城市
  10. hdu 5698(杨辉三角的性质+逆元)