1. 程式人生 > >自己寫的Python資料庫連線類和sql語句拼接方法

自己寫的Python資料庫連線類和sql語句拼接方法

這個工具類十分簡單和簡潔。

sql拼接方法

複製程式碼
# encoding=utf-8
from django.http import HttpResponse
from anyjson import serialize
from django.http import HttpResponse
from anyjson import serialize
import MySQLdb


def safe(s):
    return MySQLdb.escape_string(s)


def get_i_sql(table, dict):
    '''
    生成insert的sql語句
    @table,插入記錄的表名
    @dict,插入的資料,字典
    '''
    sql = 'insert into %s set ' % table
    sql += dict_2_str(dict)
    return sql


def get_s_sql(table, keys, conditions, isdistinct=0):
    '''
        生成select的sql語句
    @table,查詢記錄的表名
    @key,需要查詢的欄位
    @conditions,插入的資料,字典
    @isdistinct,查詢的資料是否不重複
    '''
    if isdistinct:
        sql = 'select distinct %s ' % ",".join(keys)
    else:
        sql = 'select  %s ' % ",".join(keys)
    sql += ' from %s ' % table
    if conditions:
        sql += ' where %s ' % dict_2_str_and(conditions)
    return sql


def get_u_sql(table, value, conditions):
    '''
        生成update的sql語句
    @table,查詢記錄的表名
    @value,dict,需要更新的欄位
    @conditions,插入的資料,字典
    '''
    sql = 'update %s set ' % table
    sql += dict_2_str(value)
    if conditions:
        sql += ' where %s ' % dict_2_str_and(conditions)
    return sql


def get_d_sql(table, conditions):
    '''
        生成detele的sql語句
    @table,查詢記錄的表名

    @conditions,插入的資料,字典
    '''
    sql = 'delete from  %s  ' % table
    if conditions:
        sql += ' where %s ' % dict_2_str_and(conditions)
    return sql


def dict_2_str(dictin):
    '''
    將字典變成,key='value',key='value' 的形式
    '''
    tmplist = []
    for k, v in dictin.items():
        tmp = "%s='%s'" % (str(k), safe(str(v)))
        tmplist.append(' ' + tmp + ' ')
    return ','.join(tmplist)


def dict_2_str_and(dictin):
    '''
    將字典變成,key='value' and key='value'的形式
    '''
    tmplist = []
    for k, v in dictin.items():
        tmp = "%s='%s'" % (str(k), safe(str(v)))
        tmplist.append(' ' + tmp + ' ')
    return ' and '.join(tmplist)
複製程式碼

 

資料庫連線類

複製程式碼
class SqlConn():
    def __init__(self):
        self.conn= DBpool.pool.connection()
        self.cur=self.conn.cursor()
    def cur(self):
        return self.cur()
    def commit(self):
        self.conn.commit()
    def execute(self,sql,fetchone=0):
        self.cur.execute(sql)
        return self.cur.fetchone() if fetchone else self.cur.fetchall()
    def last_id(self,table):
        sql='SELECT LAST_INSERT_ID() from %s'%table
        return self.execute(sql,1)[0]
    def close(self):
        self.cur.close()
        self.conn.close()
複製程式碼

self.conn= DBpool.pool.connection()
中,我用的是連線池連線,這裡可以改成普通的資料庫連線

查詢結果解析方法

複製程式碼
def fSqlResult(r,key_list):
    #r @tuple 資料庫fetchall的結果
    #key_list @list 查詢欄位的keys
    # format SQL Result 格式化資料庫查詢的結果,轉化成包含多個字典的列表格式,即((1,2),(3,4))->[{"key1":1,"key2":2},{"key1":3,"key2":4}]
    #返回 @dict 查詢結果
    mlist=[]
    l=len(key_list)
    if r:
        for item in r:
            tmp={}
            for i in range(l):
                tmp[key_list[i]]=str(item[i])
            mlist.append(tmp)
    return mlist
複製程式碼

使用方法:

例如要執行sql語句:select username,pwd,type,age,birth from user where username='abc';

conn=SqlConn()
key_list=['username','pwd','type','age','birth']
sql=s_sql('user',key_list,{'username':'abc'}
r=conn.execute(sql)
data=fSqlResult(r,key_list)
conn.close()

data的格式為[{'username':'i am username','pwd':'i am pwd','type':'student','age':12,'birth':'2014-7-2'}]
方便快捷,適用於經常需要用到資料庫的CRUD連線的應用。