sqlite选择多个表

时间:2018-06-03 09:40:24

标签: python sqlite

我在sqlite中有一个c.300表的数据库。目前,我正在遍历列表并附加数据。

有更快的方式/更多的pythonic方式吗?

df = []
for i in Ave.columns:
    try:
        df2 = get_mcap(i)
        df.append(df2)
        #print (i)
    except:
        pass
df = pd.concat(df, axis=0

Ave是一个数据框,我希望迭代列表中的列。

def get_mcap(Ticker):
    cnx = sqlite3.connect('Market_Cap.db')
    df = pd.read_sql_query("SELECT * FROM '%s'"%(Ticker), cnx)
    df.columns = ['Date', 'Mcap-Ave', 'Mcap-High', 'Mcap-Low']
    df = df.set_index('Date')
    df.index = pd.to_datetime(df.index)
    cnx.close
    return df

1 个答案:

答案 0 :(得分:1)

在我发布我的解决方案之前,我应该包含一个快速警告,你应该永远不要使用字符串操作来生成SQL查询,除非它绝对不可避免,在这种情况下你需要确定你是在控制数据,这是用于格式化字符串,它不会包含任何会导致查询无意中执行操作的内容。

话虽如此,这似乎是您需要使用字符串格式的情况之一,因为您无法将表名作为参数传递。只要确保用户无法改变表格列表中包含的内容。

解决方案。看起来您可以使用以下方式获取表格列表:

tables = Ave.columns.tolist()

对于我的简单示例,我将使用:

tables = ['table1', 'table2', 'table3']

然后使用以下代码生成单个查询:

query_template = 'select * from {}'
query_parts = []
for table in tables:
    query = query_template.format(table)
    query_parts.append(query)
full_query = ' union all '.join(query_parts)

,并提供:

'select * from table1 union all select * from table2 union all select * from table3'

然后,您只需执行此一个查询即可获得结果:

cnx = sqlite3.connect('Market_Cap.db')
df = pd.read_sql_query(full_query, cnx)

然后从这里你应该能够设置索引,转换为日期时间等,但现在你只需要做一次这些操作而不是300次。我想现在的整体运行时间应该更快。