如何在psycopg2查询中使用Python变量查询PostgreSQL数据?
解决psycopg2查询中使用Python变量的问题
你遇到的问题是因为SQL语句把Python变量stockChoice当成了数据库列名,而不是变量里存储的股票代码值。psycopg2有专门的参数化查询方式,既能解决这个问题,还能避免SQL注入风险,下面是具体的解决步骤:
正确的查询写法
方法1:使用位置占位符
把SQL语句中的变量替换成%s,然后将变量作为第二个参数传给execute()方法:
cur.execute('SELECT company, stockTicker, industry FROM stockNames WHERE stockTicker = %s;', (stockChoice,))
注意这里的(stockChoice,)是一个元组,即使只有一个参数,也要加逗号确保是元组类型。
方法2:使用命名占位符(更清晰,适合多参数场景)
如果后续有多个参数要传递,用命名占位符可读性更强:
cur.execute('SELECT company, stockTicker, industry FROM stockNames WHERE stockTicker = %(ticker)s;', {'ticker': stockChoice})
结合你的代码完善打印逻辑
查询之后需要获取结果,然后把公司名称和行业填充到打印语句里,修改后的完整代码片段如下:
import psycopg2 # 假设你已经完成数据库连接和游标初始化 conn = psycopg2.connect("dbname=你的数据库名 user=用户名 password=密码") cur = conn.cursor() stockChoice = input('Select a stock ticker: ') # 执行参数化查询 cur.execute('SELECT company, stockTicker, industry FROM stockNames WHERE stockTicker = %s;', (stockChoice,)) # 获取查询结果(股票代码唯一,用fetchone()获取单条记录) stock_data = cur.fetchone() if stock_data: company_name, ticker, industry = stock_data # 填充打印内容 print('\nCompany Name:', company_name) print('Stock Ticker:', ticker) print('Industry:', industry, '\n') else: print(f'\n未找到代码为 {stockChoice} 的股票\n') # 保留你原有的股价和日期逻辑 stockPrice = soup.find(class_="Fw(b) Fz(36px) Mb(-4px) D(ib)") print('Date: ') # 可补充获取日期的逻辑 print('Stock Price:', stockPrice.text if stockPrice else '未获取到股价') # 关闭游标和连接 cur.close() conn.close()
关键注意点
- 绝对不要用Python字符串格式化(比如
f"SELECT ... WHERE stockTicker='{stockChoice}'")拼接SQL语句,这会引发SQL注入漏洞,还容易因特殊字符导致语法错误。 - 查询后要判断
stock_data是否为空,避免用户输入不存在的股票代码时触发报错。
内容的提问来源于stack exchange,提问作者user19891327
相关产品推荐
相关产品推荐

