【问题标题】:Attaching multiple db3 files using python使用python附加多个db3文件
【发布时间】:2020-02-11 18:57:11
【问题描述】:

我有 4 个 SQLite 数据库,它们都具有完全相同的架构,但每个数据库都有唯一的数据。我想结合所有 4 并对它们运行查询。我还想用 Pandas 对组合数据库中的各种表进行一些分析。这将是我想要编写脚本的重复任务。我有一些 Python 的背景,只是想在现实世界的项目中学习和利用 Python。

到目前为止,我有 4 个 .db3 文件

db1
db2
db3
db4

所有都具有相同的架构,只是来自 4 个来源的数据。我试图通过 python 脚本使用 sqlite3 附加所有 4 并运行 ATTACH 但有问题。

我的想法是遍历文件夹中的文件并写入新数据库,运行自定义查询,输出到数据框,并进行其他排序/过滤/匹配/图形操作。

import sqlite3

conn = sqlite3.connect("db1.db3")
conn2 = sqlite3.connect("db2.db3")
print("Opened db1 db successfully...")

c = conn.cursor()
c2 = conn2.cursor()

rows = c.execute("SELECT * from table_name")
c.execute("ATTACH db2.db3 as newdb")
print (rows)
print (type(rows))
dir(rows)

寻找想法指导

【问题讨论】:

    标签: python sql database sqlite


    【解决方案1】:

    考虑在ATTACH 之后的UNION 查询,并使用一个指示符指示其来源,所有这些都使用一个连接:

    import sqlite3
    
    conn = sqlite3.connect("db1.db3")    
    print("Opened db1 db successfully...")
    
    c = conn.cursor()
    
    c.execute("ATTACH 'db2.db3' as db2")
    c.execute("ATTACH 'db3.db3' as db3")
    c.execute("ATTACH 'db4.db3' as db4")
    
    union_sql = '''SELECT *, 'db1' as source
                   FROM table_name 
                   UNION ALL
                   SELECT *, 'db2' as source
                   FROM db2.table_name 
                   UNION ALL
                   SELECT *, 'db3' as source
                   FROM db3.table_name 
                   UNION ALL
                   SELECT *, 'db4' as source
                   FROM db4.table_name 
                '''
    
    rows = c.execute(sql)
    
    for r in rows.fetchall():
        print(r)
    ...
    

    对于 pandas,将上述联合查询传递到 read_sql

    df = pd.read_sql(union_sql, conn)
    
    df.shape
    df.dtypes
    df.describe(include='all')
    
    df.head(10)
    df.tail(10)
    

    【讨论】:

    • 感谢您抽出宝贵时间回复。我会告诉你它是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-25
    • 2014-12-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多