2016-11-05 44 views
1

我有結構爲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

+0

不爲這個問題的答案,但你可以使用'users = list(playlists.keys())'和'tracks = list(playlists.values())'' – viraptor

+1

'來簡化你的列表。我不確定這些列表如何映射到你的數據庫表,但一旦你有一個代表數據庫行的元組列表,你可以使用[executemany](https:// d ocs.python.org/3.7/library/sqlite3.html)方法。 –

+0

查詢應該看起來像INSERT INTO播放列表(id,user,track_names,count)VALUES(%s,%s,%d),(%s,%s,%d),...'。因此,創建一個查詢字符串,其中包含與len(用戶)一樣多的值列表,然後構建字典中所有值的列表 – Barmar

回答

2

只需使用嵌套列表理解來構建元組列表。然而,關係到你的主鍵一個重要的項目,因爲TEXT的類型更改爲INTEGER不能使用自動增量IDS:

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)