从sqlite3附加表的Python循环列表

从sqlite3附加表的Python循环列表,python,sqlite,for-loop,Python,Sqlite,For Loop,在我的sqlite3数据库中有数百个表,但我想做的是创建一个dataframe,它只附加数据库中与我创建的单独列表中包含的名称相匹配的表 该列表称为“col_list”,当前仅包含3个元素(3个名称) 到目前为止,我的尝试导致了以下非常麻烦的问题: conn = sqlite3.connect('all_data.db') query = "SELECT * FROM " + col_list[0] + ";" df = pd.read_sql_query

在我的sqlite3数据库中有数百个表,但我想做的是创建一个dataframe,它只附加数据库中与我创建的单独列表中包含的名称相匹配的表

该列表称为“col_list”,当前仅包含3个元素(3个名称)

到目前为止,我的尝试导致了以下非常麻烦的问题:

conn = sqlite3.connect('all_data.db')
query = "SELECT * FROM " + col_list[0] + ";"
df = pd.read_sql_query(query, conn)

conn = sqlite3.connect('all_data.db')
query = "SELECT * FROM " + col_list[1] + ";"
df1 = pd.read_sql_query(query, conn)
df2 = df.append(df1)

conn = sqlite3.connect('all_data.db')
query = "SELECT * FROM " + col_list[2] + ";"
df3 = pd.read_sql_query(query, conn)
df4 = df2.append(df3)

df4 = df4.sort_values(by = 'date')
df4 = df4.reset_index(drop=True)
“col_list”中的元素数量可能会有所不同,这取决于我当前的代码结构,这意味着每次发生这种情况时都要重写代码。 最终,我希望能够将这些都作为一个“for”循环来工作,并因此向你们寻求帮助


感谢您抽出时间阅读此内容。

如果我正确理解了您的问题,您想这样做吗

df_all = None
conn = sqlite3.connect('all_data.db')
for col in col_list:
    query = "SELECT * FROM " + col + ";"
    df = pd.read_sql_query(query, conn)
    if df_all is not None:
        # See also @Parfait's comment below
        # about performance cost of append()
        df_all = df_all.append(df)
    else:
        df_all = df
conn.close()
df_all = df_all.sort_values(by = 'date')
df_all = df_all.reset_index(drop=True)

有数百张桌子。。。听起来像是一个数据库设计问题。如果表具有由数字或日期后缀指定的相同结构,则考虑一个标准化关系模型的单个表。那么,就不需要添加熊猫了。@Parfait谢谢,但我不想添加数据库中的所有表,只想添加从不同数据源生成的列表中包含的表。我的建议超出了您当前的问题,即使用关系数据库的最佳实践。今天您使用SQLite,但明天您将使用企业服务器RDBMS,如Postgres。数据库不应该是数据块的转储文件,而应该遵循一个规则。只需省去路上复杂的查询和数据争用。祝你好运和快乐@冻糕。我对编码和数据库非常陌生,因此非常感谢我在这里得到的所有帮助。你们让这个社区变得如此美好。维基百科的链接很有洞察力,谢谢你的帮助。是的,像你的环是我要找的。但是,我得到一条错误消息ValueError:数据帧的真值是不明确的。使用a.empty、a.bool()、a.item()、a.any()或a.all()。这是由。。if df_all:我刚刚再次检查,您所做的编辑只生成包含其中一个表的数据帧。没有添加任何内容。我无法在您的计算机上运行代码。在
df\u all.append(df)
之前放置一个
print(df)
,看看发生了什么。嗨,我设法解决了一个小问题:如果df\u all不是None:df\u all=df\u all.append(df)。改用列表或字典,然后在循环外使用
concat
df_all = None
conn = sqlite3.connect('all_data.db')
for col in col_list:
    query = "SELECT * FROM " + col + ";"
    df = pd.read_sql_query(query, conn)
    if df_all is not None:
        # See also @Parfait's comment below
        # about performance cost of append()
        df_all = df_all.append(df)
    else:
        df_all = df
conn.close()
df_all = df_all.sort_values(by = 'date')
df_all = df_all.reset_index(drop=True)