[Python] SQLBuilder 示例代码

用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", "'[email protected]'")

  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 示例代码

时间: 2024-08-29 14:32:55

[Python] SQLBuilder 示例代码的相关文章

关于一些python爬虫示例代码

https://github.com/shengqiangzhang/examples-of-web-crawlers 提示:隔离区可通过gitee传送 参考:https://www.zhangshengrong.com/p/2EaE06do1M/ 原文地址:https://www.cnblogs.com/pu369/p/12402876.html

python合并文本文件示例代码

python合并文本文件示例代码. python实现两个文本合并employee文件中记录了工号和姓名cat employee.txt: 100 Jason Smith200 John Doe300 Sanjay Gupta400 Ashok Sharma bonus文件中记录工号和工资cat bonus.txt: 100 $5,000200 $500300 $3,000400 $1,250要求把两个文件合并并输出如下, 处理结果:400 ashok sharma $1,250 100 jaso

【转】python共享引用(多个变量引用)示例代码

python共享引用(多个变量引用)示例代码_python_脚本之家http://www.jb51.net/article/44109.htm python单个(一个)对象被多个变量引用又是怎么一回事儿呢?看下面代码 a = 3b = a 先上图(图1)吧,大家一看就一目了然了: 变量名和对象,在运行赋值语句b = a之后,变量a,b都指向了对象3的内存空间. 假设这时执行 a = 'python', a将指向刚创建的字符串对象. 我们再来试试这种情况: >>>list_1 = [1,2

pyspider示例代码二:解析JSON数据

本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: pyspider爬取的内容通过回调的参数response返回,response有多种解析方式.1.response.json用于解析json数据2.response.doc返回的是PyQuery对象3.response.etree返回的

【玩转微信公众平台之八】 示例代码分析

0.下载安装Opencv,当前版本为249. 1.下载Python,当前OPencv版本为249,不过其支持的最新版本的Python为2.7,所以可以下载276版本. 2.下载numpy,开始我使用了1.6,没有通过,错误如图.下载了最新的1.8.1版本. 3.将Opencv安装目录下opencv\build\python\2.7\x86中的cv2.pyd复制到python安装目录Lib\site-packages下. 4.找到opencv源文件内的draw.py运行. [玩转微信公众平台之八]

pyspider示例代码三:用PyQuery解析页面数据

本系列文章主要记录和讲解pyspider的示例代码,希望能抛砖引玉.pyspider示例代码官方网站是http://demo.pyspider.org/.上面的示例代码太多,无从下手.因此本人找出一下比较经典的示例进行简单讲解,希望对新手有一些帮助. 示例说明: 本示例主要是PyQuery解析返回的response页面数据.response.doc解析页面数据是pyspider的主要用法,应该熟练掌握基本使用方法.其他返回类型示例见后续文章. pyspider爬取的内容通过回调的参数respon

C/C++ 开源库及示例代码

C/C++ 开源库及示例代码 Table of Contents 说明 1 综合性的库 2 数据结构 & 算法 2.1 容器 2.1.1 标准容器 2.1.2 Lockfree 的容器 2.1.3 环形缓冲 2.1.4 多维数组 2.1.5 图 2.2 对容器的操作 2.3 字符串处理 2.3.1 字符集 2.3.2 字符串格式化 2.3.3 正则表达式 2.3.4 (其它) 2.4 内存相关 2.4.1 智能指针 2.4.2 内存池 2.5 时间 & 日期 2.6 编码 & 解码

python selenium2示例 - email发送

前言 在进行日常的自动化测试实践中,我们总是需要将测试过程中的记录.结果等等等相关信息通过自动的手段发送给相关人员.python的smtplib.email模块为我们提供了很好的email发送等功能的实现. 纯文本邮件 在通常情况下,我们需要发送大量的纯文本类的邮件通知,或是发送概要性测试报告时,会用到此类发送方式,示例代码如下: #-*- coding:utf-8 -*- __author__ = u'苦叶子' import smtplib from email.mime.text impor

《算法图解》示例代码的实现

这几天看了<算法图解>,把里面的示例代码都实现了一边,在 github 上找到了一位朋友的仓库,fork 了他的. 里面有我们添加的 Python,Java,C++的实现,欢迎大家 fork!!! 附上网址:https://github.com/lynxux/AlgorithmDiagram 原文地址:https://www.cnblogs.com/linkcode/p/8185994.html