【问题标题】:sqlite - Inserting many values at oncesqlite - 一次插入多个值
【发布时间】:2017-03-18 22:20:20
【问题描述】:

我的数据结构为dictionary,我想用它来提供database

playlists={
'user1':{'Karma Police':3.0,'Roxanne':4.0,'Sonnet':5.0,'We Will Rock You':1.0,'Song 1': 1.0},
'user2':{'Karma Police':2.0,'Roxanne':3.0,'Sonnet':2.0,'We Will Rock You':3.0,'Song 2': 1.0},
'user3':{'Karma Police':8.0,'Roxanne':1.0,'Sonnet':6.0,'We Will Rock You':4.0,'Song 3': 1.0},
'user4':{'Karma Police':5.0,'Roxanne':2.0,'Sonnet':1.0,'We Will Rock You':6.0,'Song 4': 1.0},
'user5':{'Karma Police':9.0,'Roxanne':4.0,'Sonnet':7.0,'We Will Rock You':9.0,'Song 4': 1.0}}

然后我将数据组织成单独的lists

users = [k for k in playlists.keys()]
tracks = [track for track in playlists.values()]//won't need this
track_names = [t.keys() for t in tracks]
counts = [t.values() for t in tracks]

并创建database:

db = sqlite3.connect(':memory:')    
db = sqlite3.connect('users/playlistsdb')    
c = db.cursor()

c.execute('''
    CREATE TABLE playlists(
    id text primary key, 
    user TEXT,
    track_names TEXT,  
    count INTEGER)
''')

使用逻辑columns = ['user', 'track_names', 'counts']

如何一次将所有值插入playlistsdb

【问题讨论】:

  • 不是问题的答案,但您可以使用users = list(playlists.keys())tracks = list(playlists.values()) 使您的列表更简单
  • 我不确定这些列表将如何映射到您的数据库表,但是一旦您拥有代表数据库行的元组列表,您就可以使用 executemany 方法。
  • 查询应该类似于INSERT INTO playlists (id, user, track_names, count) VALUES (%s, %s, %d), (%s, %s, %d), ...。所以创建一个查询字符串,它的值列表与len(users) 一样多,然后构建一个包含字典中所有值的列表

标签: python sqlite


【解决方案1】:

只需使用嵌套列表推导来构建元组列表。但是,与您的主键相关的一个关键项目,将类型更改为 INTEGER,因为 TEXT 不能用于自动增量 ID:

playlists={'user1':{'Karma Police':3.0,'Roxanne':4.0,'Sonnet':5.0,
                    'We Will Rock You':1.0,'Song 1': 1.0},
           'user2':{'Karma Police':2.0,'Roxanne':3.0,'Sonnet':2.0,
                    'We Will Rock You':3.0,'Song 2': 1.0},
           'user3':{'Karma Police':8.0,'Roxanne':1.0,'Sonnet':6.0,
                    'We Will Rock You':4.0,'Song 3': 1.0},
           'user4':{'Karma Police':5.0,'Roxanne':2.0,'Sonnet':1.0,
                    'We Will Rock You':6.0,'Song 4': 1.0},
           'user5':{'Karma Police':9.0,'Roxanne':4.0,'Sonnet':7.0,
                    'We Will Rock You':9.0,'Song 4': 1.0}}

sqltuples = [(k1, k2, v2) for k1, v1 in playlists.items() for k2, v2 in v1.items()]

c = db.cursor()

c.execute('''
    CREATE TABLE playlists(
    id INTEGER PRIMARY KEY,
    user TEXT,
    track_names TEXT,  
    count INTEGER)
''')
db.commit()

c.executemany('INSERT INTO playlists (user, track_names, count) VALUES (?,?,?)', sqltuples)
db.commit()

输出

c.execute("SELECT * FROM playlists;")
for row in c.fetchall():
    print(row)

# (1, 'user1', 'Sonnet', 5)
# (2, 'user1', 'Roxanne', 4)
# (3, 'user1', 'Karma Police', 3)
# (4, 'user1', 'Song 1', 1)
# (5, 'user1', 'We Will Rock You', 1)
# (6, 'user5', 'Sonnet', 7)
# (7, 'user5', 'Song 4', 1)
# (8, 'user5', 'Roxanne', 4)
# (9, 'user5', 'Karma Police', 9)
# (10, 'user5', 'We Will Rock You', 9)
# (11, 'user4', 'Sonnet', 1)
# (12, 'user4', 'Song 4', 1)
# (13, 'user4', 'Roxanne', 2)
# (14, 'user4', 'Karma Police', 5)
# (15, 'user4', 'We Will Rock You', 6)
# (16, 'user2', 'Sonnet', 2)
# (17, 'user2', 'Song 2', 1)
# (18, 'user2', 'Roxanne', 3)
# (19, 'user2', 'Karma Police', 2)
# (20, 'user2', 'We Will Rock You', 3)
# (21, 'user3', 'Sonnet', 6)
# (22, 'user3', 'Roxanne', 1)
# (23, 'user3', 'Karma Police', 8)
# (24, 'user3', 'Song 3', 1)
# (25, 'user3', 'We Will Rock You', 4)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-04-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    相关资源
    最近更新 更多