Python MySQLdb - 类中的连接

新手上路,请多包涵

我正在制作一个 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/函数调用。我想要得到的是一个完善的查询,我可以在其中进行查询并检索其内容。这将总结我的代码,因此我应该这样做。

原文由 Marshall 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 615
2 个回答

我通常使用 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)

我希望这有帮助!

原文由 carusot42 发布,翻译遵循 CC BY-SA 4.0 许可协议

这不是你在 Python 中编写类的方式。您需要在 __init__ 方法中定义连接和光标,并通过 self 引用它们。

 class sql:

    dbc = ("localhost","root","1234","users")

    def __init__(self):
        db = MySQLdb.connect(*self.dbc)
        self.cursor = db.cursor()

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

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

原文由 Daniel Roseman 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题