Python 从列表框值中选择给定WHERE子句的数据库中的数据
我正在尝试检索给定特定姓氏的关联数据。但是,该姓氏与名和分隔符逗号一起存储在列表框中。因此,首先通过光标选择从列表框中检索名称,通过对其余名称进行分区,只使用姓氏进行搜索:Python 从列表框值中选择给定WHERE子句的数据库中的数据,python,sql,python-3.x,postgresql,tkinter,Python,Sql,Python 3.x,Postgresql,Tkinter,我正在尝试检索给定特定姓氏的关联数据。但是,该姓氏与名和分隔符逗号一起存储在列表框中。因此,首先通过光标选择从列表框中检索名称,通过对其余名称进行分区,只使用姓氏进行搜索: lastname, sep, firstname = (self.patient_list.get(self.patient_list.curselection())).partition(',') 完成后,我将尝试获取所选姓氏的数据行打印输出。然而,我遇到了一个问题: TypeError: argument 1 mus
lastname, sep, firstname = (self.patient_list.get(self.patient_list.curselection())).partition(',')
完成后,我将尝试获取所选姓氏的数据行打印输出。然而,我遇到了一个问题:
TypeError: argument 1 must be a string or unicode object: got tuple instead
我想知道如何处理这个问题。我尝试了一些解决方案,例如load\u query
中参数内的tuple
函数,以及lastname
上的str
,但它是一个字符串
我还想知道是否有必要用这种方法从PostgreSQL数据库中进行选择。我可以尝试将listbox元素绑定到数据库中的一行数据吗?或者避免对元素进行分区,因为这可能会带来麻烦
完整代码:
def load_profile(self, event):
conn = pg.connect(user='postgres',
password='123!',
host='localhost',
port='5430',
database='carepartnerdb')
cur = conn.cursor()
#gets lastname from listbox, removes all else past the comma
#used to associate to DB
lastname, sep, firstname = (self.patient_list.get(self.patient_list.curselection())).partition(',')
load_query = (""" SELECT * FROM profiles_table WHERE patient_lastname=%s """, lastname)
cur.execute(load_query)
conn.commit()
#data = cur.fetchall()
#print(data)
cur.close()
conn.close()
load\u query
是一个tuple
,因此cur.execute(load\u query)
将引发异常,因为execute()
需要一个字符串(查询字符串)作为第一个参数
您应该更改:
load_query = (""" SELECT * FROM profiles_table WHERE patient_lastname=%s """, lastname)
cur.execute(load_query)
致:
另外,
SELECT
语句不需要commit()。首先调用self.patient\u list.curseelection()
,并将结果保存到变量中。检查变量,看看它是否符合预期。然后,将结果传递给self.patient\u list.get。结果和你期望的一样吗?然后,调用partitiion
,再次检查结果。其中一个步骤可能是做一些与您假设的不同的事情。这行得通吗load\u query=“从配置文件\u表中选择*,其中患者\u lastname=%s”,(lastname),
,然后cur.execute(load\u query)
或者它仍然是一个tupleNo它将不起作用。您可以通过打印(键入(加载查询))
轻松验证它。因此,基本上,即使我们不说()
,但值用逗号分隔,那么它是一个元组?
load_query = "SELECT * FROM profiles_table WHERE patient_lastname = %s"
cur.execute(load_query, (lastname,))