You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.25 19:12:16