【问题标题】:Adding SQL for loop in python在python中添加SQL for循环
【发布时间】:2020-06-23 03:37:29
【问题描述】:

我是一个编程新手,我有一个数据库文件,里面有一些日期,打开,高,低,关闭数据,名称为0001.HK; 0002.HK; 0003.HK 然后我尝试建立一个循环来取出数据库中的一些数据。

conn = sqlite3.connect(os.path.join('data', "hkprice.db"))


def read_price(stock_id):
    
    connect = 'select Date, Open, High, Low, Close, Volume from ' + stock_id
    df = pd.read_sql(connect, conn,index_col=['Date'], parse_dates=['Date'])

for y in range(1 ,2):
    read_price(str(y).zfill(4) + '.HK')

输出时显示:sql 'select Date, Open, High, Low, Close, Volume from 0001.HK'执行失败:无法识别的令牌:“0001.HK”

但我应该在数据库中有 0001.HK 表 我该怎么办?

【问题讨论】:

  • 尝试在您传递的值周围添加'read_price("'" + str(y).zfill(4) + ".HK'")
  • 它的作品非常感谢你!然后和其他问题......我如何在循环时跳过没有这样的表?
  • 你遇到什么样的错误?您可以简单地添加一个try-except 指定错误类型的语句,并让它在表不存在的情况下简单地传递。
  • @pavel 你好,先生!感谢您再次回答我我看到有人使用except: pass(它不起作用),但我发现我不应该循环带有数字范围的文件名......在我的sql db中,一些数字不是存在,如0012.HK(存在); 0013.HK(不存在); 0014.HK(存在),所以我认为我不应该循环使用文件名,但我不确定如何逐个读取sql
  • @y2kmarkham,这很奇怪,因为except: pass 应该可以工作,尽管这样使用它是一个非常糟糕的习惯。而是在 except %ExceptionClass%: 处将 %ExceptionClass% 替换为您获得的实际异常类。确保pass 位于下一行并正确缩进。

标签: python pandas read-sql


【解决方案1】:

如果你想在查询中使用变量,你需要放置一个占位符?。所以在你的特殊情况下:

connect = 'select Date, Open, High, Low, Close, Volume from ?'

read_sql 之后,您可以向params kwarg 提供变量列表,如下所示:

df = pd.read_sql(connect, conn, params=[stock_id], index_col=['Date'], parse_dates=['Date'])

如果您有多个参数,因此有多个 ? 占位符,那么当您向 params 提供变量列表时,它们的顺序必须与您的 ? 完全相同。

编辑: 例如,如果我有一个查询,我想在某些日期之间获取数据,我会这样做:

start = ['list of dates']
end = ['another list of dates']

query = """select * 
           from table
           where start_date >= ? and
                 end_date < ?
        """

df = pd.read_sql_query(query, conn, params=[start, end])

这里解释器将看到第一个 ? 并从第一个列表中获取第一个项目,然后当它到达第二个 ? 时,它将从第二个列表中获取第一个项目。如果? 的数量与提供的参数数量不匹配,则会引发错误。

【讨论】:

  • 非常感谢,但我对占位符有点困惑,我是否正确放置 'select ... from ' + stock_id ?
  • 不,您将? 作为占位符放入查询中。一旦解释器到达?,它将查看是否已向params kwarg 提供任何内容,如果全部匹配,它将自动填充数据,否则将引发错误。
  • @y2kmarkham,请参阅我的回答中添加的 EDIT 部分。
猜你喜欢
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-09
  • 1970-01-01
  • 2011-11-05
  • 2011-01-16
相关资源
最近更新 更多