0

我是一个编程新手,我有一个数据库文件,里面有一些日期,打开,高,低,关闭数据,名称为 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 表我该怎么办?

4

1 回答 1

1

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

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

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

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])

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

于 2020-06-23T03:54:10.657 回答