2017-05-28 6 views
0

Ich habe eine relationale Datenbank und ich versuche zu lernen, wie man Zeilen einfügt. Hier ist, was ich habe:Wie wird in relationale Tabellen eingefügt?

artist {id, name} 
genre {id, name} 
album {id, name, artist_id, genre_id} 
track {id, album_id, track_name} 

Mein größtes Problem ist, dass Ich mag würde artist einzigartig sein, so dass es keine Künstler mit identischen Namen sein kann, aber jede Abfrage Ich habe Einsätze Duplikate versucht. Ich habe versucht, die Tabelle auf einzigartig zu ändern, aber es ist mir unmöglich, mehr als einen Track von einem einzigen Künstler hinzuzufügen. An diesem Punkt stecke ich fest; Ich habe ON DUPLICATE-Anweisungen ohne Erfolg untersucht und sogar versucht, Duplikate in meinem Skript zu erkennen und verschiedene Einfügungen von dort auszuführen.

Danke für jede Hilfe, die Sie anbieten können.

+0

kann es da keine Möglichkeiten geben bei zwei Künstlern den gleichen Namen haben? – nilesh

Antwort

-1

Wie greifen Sie auf Ihre Datenbank zu? Verwenden Sie irgendeine Art von ORM?

Im Allgemeinen können Sie den Interpreten nicht für jeden Track neu einfügen.

Wenn Sie also Ihr Album einfügen, sollten Sie Ihre Tabelle nachschlagen, wenn der Künstler bereits existiert. Wenn es existiert, holen Sie es ID und verwenden Sie es beim Einfügen von Tracks. Wenn der Künstler noch nicht existiert, fügen Sie ihn ein und speichern Sie die artist_id, um über die Trackliste zu iterieren und jeden Track mit der artist_id einzufügen.

0

Nach Ihrem Datenbank-Design sollte es gut funktionieren. Ich nehme an, dass alle idsprimary key für ihre jeweiligen Tabellen sind. Geben Sie auch den Constraint UNIQUE für den Künstlernamen ein. Wenn Sie ein Skript zum Erstellen von Tabellen verwenden, stellen Sie sicher, dass Sie nach der Eingabe festgeschrieben werden. Nun fügen Sie einen Namen ein, der bereits vorhanden ist. Machen Sie auch Fremdschlüssel. Dieser Beispielcode funktioniert gut mit sqlite in python3.

import sqlite3 as sql 
a = sql.connect('test_db') 
conn = a.cursor() 

query = 'create table artists(id INTEGER primary key AUTOINCREMENT, artist_name varchar(30) unique)' 
conn.execute(query) 
query2 = 'create table albums(id INTEGER primary key AUTOINCREMENT, artist_id integer, foreign key(artist_id) references artists(id))' 
conn.execute(query2) 
query3 = 'create table tracks(id INTEGER primary key AUTOINCREMENT, album_name varchar(30), album_id integer, foreign key(album_id) references albums(id))' 
conn.execute(query3) 

conn.execute('insert into artists(artist_name) values("john")') 
conn.execute('insert into artists(artist_name) values("Doe")') 
conn.execute('insert into albums(artist_id) values(1)') 
conn.execute('insert into albums(artist_id) values(2)') 
conn.execute('insert into tracks(album_name, album_id) values("something",1)') 
conn.execute('insert into tracks(album_name, album_id) values("someotherthing",2)') 

a.commit() 

this helps :)

+0

Während dies hilfreich ist, würde diese Abfrage 'Einfügen in Alben (artist_id) values ​​(1)' erfordern, dass ich die artist_id zur Laufzeit kenne, richtig? Mein Ziel war es, die Primärschlüssel mit jedem eindeutigen Eintrag über Autoincrement zu generieren. Korrigiere mich, wenn ich falsch liege, aber um dies zu tun, muss ich nicht zuerst prüfen, ob der Künstler bereits existiert, und dann seinen Primärschlüssel in derselben Abfrage verwenden? Der ganze Sinn dieses Projekts besteht darin, die Musik, die ich höre, zu überwachen und dann jeden Tag die Lieder dieser Datenbank hinzuzufügen. Da ich ständig Einträge hinzufüge, ist vor jedem Eintrag die Suche nach Dubletten unvermeidbar? – jl8n

0

Warum verlassen sich auf die Struktur der Datenbank Duplikate zu verhindern?
Dies ist einfach, wenn Sie die Daten laden.
Das Folgende ist sqlite3 verwenden und wahrscheinlich muss verbessert werden:

Datendatei catalog.txt:

album 1,artist 1,rock,track 1 
album 1,artist 1,rock,track 2 
album 1,artist 1,rock,track 3 
album 1,artist 1,rock,track 4 
album 1,artist 1,rock,track 5 
album 1,artist 1,rock,track 6 
album 1,artist 1,rock,track 7 
album 1,artist 1,rock,track 8 
album 1,artist 1,rock,track 9 
album 1,artist 1,rock,track 10 
album 2,artist 1,rock,track 1 
album 2,artist 1,rock,track 2 
album 2,artist 1,rock,track 3 
album 2,artist 1,rock,track 4 
album 2,artist 1,rock,track 5 
album 3,artist 2,regge,track 1 
album 3,artist 2,regge,track 2 
album 3,artist 2,regge,track 3 
album 2,artist 3,rock,track 1 
album 2,artist 3,rock,track 2 
album 2,artist 3,rock,track 3 
album 2,artist 3,rock,track 4 
album 2,artist 3,rock,track 5 

Code:
Dies tut doppelte Albumnamen zulassen, wenn der Künstler unterscheidet
es auf dem beruht autoincrement für die Schlüssel beim Einfügen neuer Datensätze

import sqlite3 
db_name = "catalog.db" 
db = sqlite3.connect(db_name, isolation_level=None) 
db.row_factory = sqlite3.Row 
cursor = db.cursor() 
result = cursor.execute("create table if not exists artist (artist_id integer primary key autoincrement,artist_name char(150))") 
result = cursor.execute("create table if not exists genre (genre_id integer primary key autoincrement,genre_name char(150))") 
result = cursor.execute("create table if not exists album (album_id integer primary key autoincrement,album_name char(150),artist_id int,genre_id int)") 
result = cursor.execute("create table if not exists track (track_id integer primary key autoincrement,track_name char(150),album_id int)") 

with open('catalog.txt','r') as f: 
    data = f.readlines() 

for i in data: 
    track = i.split(',') 
    alb = track[0].strip() 
    art = track[1].strip() 
    gen = track[2].strip() 
    tra = track[3].strip() 

    #Check for existing artist 
    cursor.execute("select artist_id from artist where artist_name = ?",[art]) 
    data = cursor.fetchone() 
    if data: 
     art_id = data['artist_id'] 
    else: #Insert new record then record the new id 
     db.execute("insert into artist(artist_name) values (?)",(art,)) 
     cursor.execute("select artist_id from artist where artist_name = ?",[art]) 
     data = cursor.fetchone() 
     art_id = data['artist_id'] 
     print "Adding artist", art 

    #Check for existing genre 
    cursor.execute("select genre_id from genre where genre_name = ?",[gen]) 
    data = cursor.fetchone() 
    if data: 
     gen_id = data['genre_id'] 
    else: #Insert new record then record the new id 
     db.execute("insert into genre(genre_name) values (?)",(gen,)) 
     cursor.execute("select genre_id from genre where genre_name = ?",[gen]) 
     data = cursor.fetchone() 
     gen_id = data['genre_id'] 
     print " Adding genre", gen 

    #Check for existing album by given artist 
    cursor.execute("select album_id from album where album_name = ? and artist_id = ?",[alb,art_id]) 
    data = cursor.fetchone() 
    if data: 
     alb_id = data['album_id'] 
    else: #Insert new record then record the new id 
     db.execute("insert into album(album_name,artist_id,genre_id) values (?,?,?)",(alb,art_id,gen_id,)) 
     cursor.execute("select album_id from album where album_name = ? and artist_id = ?",[alb,art_id]) 
     data = cursor.fetchone() 
     alb_id = int(data[0]) 
     print " Adding album", alb 

    #Check for track in given album 
    cursor.execute("select track_id from track where album_id = ? and track_name = ?",[alb_id,tra]) 
    data = cursor.fetchone() 
    if data: 
     pass # duplicate" 
    else: 
     db.execute("insert into track(track_name,album_id) values (?,?)",(tra,alb_id,)) 
     print "  Adding", tra, art, alb 
Verwandte Themen