在python中编写一个数据库类

时间:2016-05-24 08:23:23

标签: python mysql oop

对于我正在做的业余爱好项目,我想写一个面向对象的python程序。但我遇到的第一个问题之一是为我的(MySQL)数据库创建一个类。

我正在尝试使用尽可能少的软件包,我想尝试仅使用pymysql来编写数据库类。问题是有大量的库和编写好的数据库类的缺乏解释在python中。

非常感谢任何建议和特别的例子

2 个答案:

答案 0 :(得分:1)

当具有完全相同的情况时,我找到了mysql-connector-python类,我用它创建了一个小的“模型”来从其他类调用。这是一个显示各种数据库调用的简化版本。正如您所看到的,我有一个配置类,其中包含所有数据库身份验证信息等等。

foreach (Control c in this.Controls.OfType<System.Web.UI.WebControls.PlaceHolder>().ToList())
{
    foreach (Control cc in c.Controls.OfType<System.Web.UI.HtmlControls.HtmlGenericControl>().ToList())
    {
        if (cc is System.Web.UI.HtmlControls.HtmlGenericControl)
        {
            System.Web.UI.HtmlControls.HtmlGenericControl iframe = cc as System.Web.UI.HtmlControls.HtmlGenericControl;
            if (iframe.Attributes["src"].Contains("slideshare"))
            {
                Response.Write("INDEX:"+this.Controls.IndexOf(cc)); // returns -1 
                iframe.Attributes["src"] = "/img/content/cookielaw_slideshare.jpg";

                Literal lit=new Literal();
                lit.Text = @"<div class='cookieLaw_slideshare'><a id='cookieLaw_slideshare' href='#'><img src='/img/content/cookielaw_slideshare.jpg'/></a></div>";
                Page.Controls.AddAt(this.Controls.IndexOf(cc),lit);
            }
        }
    } 
}

像这样打电话给班级:

# dependancy: mysql-connector-python (https://dev.mysql.com/downloads/connector/python/2.1.html)
import mysql.connector
import time
import config
import HTMLParser
import StringIO

html_parser = HTMLParser.HTMLParser()

try:
    connection = mysql.connector.connect( user=config.DB_USER, password=config.DB_PASSWORD,
        host = config.DB_HOST, database=config.DB_DATABASE, unix_socket=config.UNIX_SOCKET)

    cursor = connection.cursor()

except mysql.connector.Error as err:
    logger.log('Database connection failed for '+config.DB_USER+'@'+config.DB_HOST+'/'+config.DB_DATABASE)
    exit()

def get_bad_words():
    sql = ("SELECT word FROM word_blacklist")
    results = execute(sql)
    return results

def get_moderation_method():
    sql = ("SELECT var_value FROM settings "
    "WHERE var_key = %(key)s")
    results = execute(sql, True, {'key':'moderation_method'})
    return results[0]

def current_events():
    sql = ("SELECT count(id) FROM events WHERE event_date >= DATE_SUB(NOW(), INTERVAL 2 hour) AND event_date <= DATE_ADD(NOW(), INTERVAL 5 hour)")
    results = execute(sql, True)
    return results[0]

def insert_social_post(channel, filter_type, post_id, validate, user_name, user_id, user_profile_picture, text, post_date, image_url, state):
    try:
        san_user_name = html_parser.unescape(user_name.encode('utf-8').strip()).decode("utf8").encode('ascii','ignore')
    except:
        san_user_name = html_parser.unescape(user_name.strip())
    try:
        san_text = html_parser.unescape(text.encode('utf-8').strip()).decode("utf8").encode('ascii','ignore')
    except:
        san_text = html_parser.unescape(text.strip())

    insert_post = ("INSERT IGNORE INTO social_posts "
        "(channel, filter_type, post_id, validate, user_name, user_id, user_profile_picture, text, post_date, image_url, state)"
        "VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)")
    execute(insert_post, False, [channel, filter_type, str(post_id), validate,
        san_user_name.strip(), user_id, user_profile_picture, san_text.strip(), post_date, image_url, state], True)

def delete_posts(ids):
    fmt = ','.join(['%s'] * len(ids))
    cursor.execute("DELETE FROM `social_posts` WHERE id IN (%s)" % fmt,
                    tuple(ids))
    connection.commit()

def update_campaigns(campaigns):
    sql = ("UPDATE social_campaigns "
        "SET last_updated = NOW()"
        "WHERE id IN ("+(','.join(str(c) for c in campaigns))+")")
    execute(sql, False, None, True)

def execute(tuple, single = False, args = {}, commit = False):
    cursor.execute(tuple, args)

    if commit == True:
        connection.commit()
    else:
        if single == True:
            return cursor.fetchone()
        else:
            return cursor.fetchall()

def lastrowid():
    return cursor.lastrowid

def close():
    connection.close()

希望你能用它。

答案 1 :(得分:1)

import sqlite3
"""singleton class to deal with db"""
'''same can be use for pymysql just replace the sqlite3 with pymysql'''


class DBConnection:
    instance = None

    def __new__(cls, *args, **kwargs):
        if cls.instance is None:
            cls.instance = super().__new__(DBConnection)
            return cls.instance
        return cls.instance

    def __init__(self, db_name='you-db-name'):
        self.name = db_name
        # connect takes url, dbname, user-id, password
        self.conn = self.connect(db_name)
        self.cursor = self.conn.cursor()

    def connect(self):
        try:
            return sqlite3.connect(self.name)
        except sqlite3.Error as e:
            pass

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

  # write your function here for CRUD operations