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

推荐答案

我通常使用psycopg2/postgres,但这是我经常使用的基本DB类,以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)

我希望这有帮助!

Python-3.x相关问答推荐

使用Python装载. iso文件

Pandas 中每行的最大值范围

Python3和请求-超文本标记语言:试图抓取一个网站-没有取回真正的超文本标记语言代码

使用Python按照其组/ID的紧密值的递增顺序映射数据框的两列

调用 Clear 时 Airflow 会加载新代码吗

Python3:是否可以将变量用作函数调用的一部分

仅当从 USB 摄像头接收到新图像时才处理图像

将 pandas Timestamp() 转换为 datetime.datetime() 以支持 peewee DateTimeField()

Python:如何从句子/段落中提取地址(非正则表达式方法)?

SMTP 库 Python3:不太安全的应用程序访问

python用户输入5个偶数并打印最大的

你如何表达一个没有参数的 Python Callable?

python中是否有大于但小于函数?

如何在 Spyder 控制台中使用变量执行 Python 3.3 脚本?

如何在 Python3 中添加带有标志的命令行参数?

python - 使用 matplotlib 和 boto 将绘图从内存上传到 s3

警告:请使用 tensorflow/models 中的官方/mnist/dataset.py 等替代方案

如何判断列表中的所有项目是否都是字符串

字典理解中的操作顺序

在 lambda 层中导入库