为什么函数不将var`db`返回给下一个函数?

2021-06-14 22:34:25 发布

您现在位置:Python中文网/ 问答频道 /正文

class Database: 
    def set_db_setting(self, host, username, passwd, database):
        try:
            db = pymysql.connect(host=host, user=username, passwd=passwd, db=database)
        except:
            print('\nerror connecting to database\n')
    return db

功能失效时

    def db_select(self, *selected_fields, **kwargs):
        self.selected_fields = selected_fields = list(selected_fields)
        self.table = (kwargs['table']
                      if 'table' in kwargs 
                      else selected_fields.pop())

        self.where_field = (kwargs['where_field']
                            if 'where_field' in kwargs
                            else selected_fields.pop())
        try:
            with db.cursor() as cursor:
                sql_tld_id_query = Database.query_stmt_list[0]+ selected_fields + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.website.com'

        except Exception as gatherid_err:
            print("exception was {}".format(gatherid_err))
            db.rollback()

当我在最后实例化时,它失败了:

dbclass = Database()
dbclass.set_db_setting('localhost', 'root', 'password', 'garbagedb')
dbclass.db_select(['id', 'name'], table='tld', where_field='name')

更新错误

exception was Can't convert 'list' object to str implicitly

在这条线上:

sql_tld_id_query = Database.query_stmt_list[0]+ selected_fields + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.website.com'

我试着把它改成:

sql_tld_id_query = str(Database.query_stmt_list[0]+ selected_fields + Database.query_stmt_list[4] + table + Database.query_stmt_list[5] + where_field + '=' + 'www.ebay.com')

但这并不能解决问题。有人能帮忙吗?你知道吗

3条回答
网友
1楼 ·

根据你透露的密码

在这里,您放弃调用的结果(即您通过“return db”返回的结果)

dbclass.set_db_setting('localhost', 'root', 'password', 'garbagedb')

在这里,你称之为你从未实例化过的东西:

def db_select(self, *selected_fields, **kwargs):
   ...
   with db.cursor() as cursor:
   ...
   db.rollback()

你在想什么?你知道吗

然后,即使您没有忘记将调用结果赋给变量,也没有将其传递给第二个函数。 也就是说,你要用它作为全局变量。你知道吗

这绝对是一个公爵,如果不是国王,在反模式。 一定要避免。你知道吗

PS并了解变量作用域是什么。你知道吗

网友
2楼 ·

首先,缩进很重要。return语句不在set_db_setting()内,因此它不返回任何内容。你知道吗

其次,函数中定义的变量有一个作用域,该作用域仅限于函数内部,因此db不会在两个方法调用之间神奇地传输。要么将它存储在self.db(并在db_select()中引用它),要么从set_db_setting()返回它,将它存储在局部变量中,然后显式地将作为参数传递到db_select()。你知道吗

使用self.db并将其存储为实例变量将是编写代码的更常规的方法。你知道吗

网友
3楼 ·

函数似乎没有设置名为db的类变量。它只是返回那个值。然后在你的类中你试图访问一个尚未设置的变量。你知道吗

我相信你需要这样的东西。你知道吗

class Database: 
    db = None
    def set_db_setting(self, host, username, passwd, database):
        try:
            self.db = pymysql.connect(host=host, user=username, passwd=passwd, db=database)
        except:
            print('\nerror connecting to database\n')

既然已经设置了变量,那么类中的其他方法就可以访问它了。你知道吗

相关问题