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')
但这并没有解决它。有人可以帮忙吗?
答案 0 :(得分:1)
对于初学者来说,缩进很重要。退货声明不在set_db_setting()
内,因此它不会返回任何内容。
其次,函数内定义的变量有一个范围,它仅限于函数内部,因此db
不会在两个方法调用之间神奇地传输。您要么将其存储在self.db
中(并在db_select()
中引用它,或者您希望从set_db_setting()
返回它,将其存储在局部变量中,然后显式传递<强>那到db_select()
作为参数。
使用self.db
&amp;将它作为实例变量存储将是更常规的编写代码的方式。
答案 1 :(得分:0)
您的函数似乎没有设置名为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')
现在变量已设置,类中的其他方法可以访问它。
答案 2 :(得分:0)
根据你透露的代码
这里你放弃了调用的结果(这是你通过“return db”返回的)
T - item[i]
在这里你要调用你从未实例化过的东西:
dbclass.set_db_setting('localhost', 'root', 'password', 'garbagedb')
所以你想知道什么?
然后,即使您不忘记将调用结果分配给变量 - 您也没有将其传递给第二个函数。 这意味着,您将把它用作全局变量。
在反模式中,这绝对是公爵,如果不是国王的话。 一定要避免这种情况。
PS并了解变量范围是什么。