昊天SEO

python对MySqldb模块的简单封装代码

python对MySqldb的简单封装

#!/usr/local/python/bin
# coding=utf-8

'''Implements a simple database interface

Example 0: Create connection:

    # Set auto commit to false
    db = DB(False, host = 'x', user = 'x', passwd = 'x', db = 'x')

Example 1: Select SQL

a. Select the first two rows from ip table:

    # normal select
    db.select('select * from ip limit 2')
    # add a where condition:
    db.select('select * from ip where name != %s limit 2', ('0'))

b. Select all results but get only the first two:

    db.execute('select * from ip')
    # get dict rows
    db.get_rows(2, is_dict = True)

Example 2: Insert/Replace SQL

a. Insert a new record into ip table:

    db.insert('ip', {'address':'192.168.0.1', 'name': 'vm-xxx'})
    db.commit()

b. Insert multi-records into ip table:

    db.multi_insert('ip', ('address','name'), [('192.168.0.1', 'vm-xxx'),
        ('192.168.0.2', 'vm-yyy'), ('192.168.0.3', 'vm-zzz')])
    db.commit()

Example 3: Update SQL

a. Update the address of row whose name is vm-xxx:

    db.update('ip', {'address':'192.168.0.1'}, {'name': 'vm-xxx'})
    db.commit()

Example 4: Delete SQL

a. Delete the row whose name is 'vm-xxx':

    db.delete('ip', {'name': 'vm-xxx'})
    db.commit()
'''

# Can be 'Prototype', 'Development', 'Product'
__status__ = 'Development'
__author__ = 'tuantuan.lv <dangoakchan@foxmail.com>'

import sys
import MySQLdb

from pypet.common import log

class DB():
    '''A simple database query interface.'''
    def __init__(self, auto_commit, **kwargs):
        if 'charset' not in kwargs:
            kwargs['charset'] = 'utf8'

        self.conn = MySQLdb.connect(**kwargs)
        self.cursor = self.conn.cursor()
        self.autocommit(auto_commit)

    def execute(self, sql, args = None):
        return self.cursor.execute(sql, args)

    def executemany(self, sql, args):
        '''Execute a multi-row query.'''
        return self.cursor.executemany(sql, args)

    def select(self, sql, args = None):
        self.execute(sql, args)
        return self.get_rows()

    def insert(self, table, column_dict):
        keys = '`,`'.join(column_dict.keys())
        values = column_dict.values()
        placeholder = ','.join([ '%s' for v in column_dict.values() ])
        ins_sql = 'INSERT INTO %(table)s (`%(keys)s`) VALUES (%(placeholder)s)'

        return self.execute(ins_sql % locals(), values)

    def multi_insert(self, sql, args):
        '''Execute a multi-row insert, the same as executemany'''
        return self.cursor.executemany(sql, args)

    def replace(self, table, column_dict):
        keys = '`,`'.join(column_dict.keys())
        values = column_dict.values()
        placeholder = ','.join([ '%s' for v in column_dict.values() ])
        repl_sql = 'REPLACE INTO %(table)s (`%(keys)s`) VALUES (%(placeholder)s)'

        return self.execute(repl_sql % locals(), values)

    def update(self, table, column_dict, cond_dict):
        set_stmt = ','.join([ '%s=%%s' % k for k in column_dict.keys() ])
        cond_stmt = ','.join([ '%s=%%s' % k for k in cond_dict.keys() ])
        args = column_dict.values() + cond_dict.values()
        upd_sql = 'UPDATE %(table)s set %(set_stmt)s where %(cond_stmt)s'

        return self.execute(upd_sql % locals(), args)

    def delete(self, table, cond_dict):
        cond_stmt = ','.join([ '%s=%%s' % k for k in cond_dict.keys() ])
        del_sql = 'DELETE FROM %(table)s where %(cond_stmt)s'

        return self.execute(del_sql % locals(), cond_dict.values())

    def get_rows(self, size = None, is_dict = False):
        if size is None:
            rows = self.cursor.fetchall()
        else:
            rows = self.cursor.fetchmany(size)

        if rows is None:
            rows = []

        if is_dict:
            dict_rows = []
            dict_keys = [ r[0] for r in self.cursor.description ]

            for row in rows:
                print row, dict_keys
                print zip(dict_keys, row)
                dict_rows.append(dict(zip(dict_keys, row)))

            rows = dict_rows

        return rows

    def get_rows_num(self):
        return self.cursor.rowcount

    def get_mysql_version(self):
        MySQLdb.get_client_info()

    def autocommit(self, flag):
        self.conn.autocommit(flag)

    def commit(self):
        '''Commits the current transaction.'''
        self.conn.commit()

    def __del__(self):
        #self.commit()
        self.close()

    def close(self):
        self.cursor.close()
        self.conn.close()

# vim: set expandtab smarttab shiftwidth=4 tabstop=4:
网站的维护离不开大家的支持鼓励,捐赠让我更有动力走的更远&& 也可以关注我的微信公众号,发布更多的干货
本文网址:https://www.168seo.cn/python/1652.html

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址