Python MySQLdb-类中的连接

发布于 2021-01-29 15:10:07

我正在做一个Python项目,我必须从数据库中查找和检索数据。
我尝试过创建一个类,在其中声明连接并进行查询,这是到目前为止我所没有的。

import MySQLdb
dbc =("localhost","root","1234","users")
class sql:
    db = MySQLdb.connect(dbc[0],dbc[1],dbc[2],dbc[3])
    cursor = db.cursor()

    def query(self,sql):
        sql.cursor.execute(sql)
        return sql.cursor.fetchone()

    def rows(self):
        return sql.cursor.rowcount

sqlI = sql()
print(sqlI.query("SELECT `current_points` FROM `users` WHERE `nick` = 'username';"))

因此,主要问题是该变量dbcursor不能从同一类的其他def
/函数中调用。我想要得到的是一个精细的查询,在这里我可以进行查询并检索其内容。这将总结我的代码,因此我应该这样做。

关注者
0
被浏览
45
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    我通常使用psycopg2 / postgres,但这是我经常使用的基本数据库类,以Python的SQLite为例:

    import sqlite3
    
    class Database:
        def __init__(self, name):
            self._conn = sqlite3.connect(name)
            self._cursor = self._conn.cursor()
    
        def __enter__(self):
            return self
    
        def __exit__(self, exc_type, exc_val, exc_tb):
            self.close()
    
        @property
        def connection(self):
            return self._conn
    
        @property
        def cursor(self):
            return self._cursor
    
        def commit(self):
            self.connection.commit()
    
        def close(self, commit=True):
            if commit:
                self.commit()
            self.connection.close()
    
        def execute(self, sql, params=None):
            self.cursor.execute(sql, params or ())
    
        def fetchall(self):
            return self.cursor.fetchall()
    
        def fetchone(self):
            return self.cursor.fetchone()
    
        def query(self, sql, params=None):
            self.cursor.execute(sql, params or ())
            return self.fetchall()
    

    这将使您Database可以正常使用类db = Database('db_file.sqlite)或在with语句中使用该类:

    with Database('db_file.sqlite') as db:
        # do stuff
    

    with语句退出时,连接将自动提交并关闭。

    然后,您可以封装经常在方法中执行的特定查询,并使它们易于访问。例如,如果您正在处理交易记录,则可以使用一种方法来按日期获取它们:

    def transactions_by_date(self, date):
        sql = "SELECT * FROM transactions WHERE transaction_date = ?"
        return self.query(sql, (date,))
    

    这是一些示例代码,我们在其中创建一个表,添加一些数据,然后将其读出:

    with Database('my_db.sqlite') as db:
        db.execute('CREATE TABLE comments(pkey INTEGER PRIMARY KEY AUTOINCREMENT, username VARCHAR, comment_body VARCHAR, date_posted TIMESTAMP)')
        db.execute('INSERT INTO comments (username, comment_body, date_posted) VALUES (?, ?, current_date)', ('tom', 'this is a comment'))
        comments = db.query('SELECT * FROM comments')
        print(comments)
    

    我希望这有帮助!



知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看