2017-05-28 10 views
0

私はリレーショナルデータベースを持っており、行を挿入する方法を学びたいと思っています。リレーショナル表への挿入方法は?

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

私の最大の問題は、私は同じ名前のアーティストがないことができるようにartistは、ユニークになりたいということですが、すべてのクエリは、私は挿入の重複を試してみた:ここで私が持っているものです。テーブルをユニークに変更しようとしましたが、1つのアーティストが複数のトラックを追加することは不可能です。この時点で私は立ち往生しています。私は成功していないON DUPLICATE文を見てきましたし、スクリプト内の重複を検出してそこから別の挿入を実行しようとしても試みました。

ご協力いただきありがとうございます。

+0

可能性はありません2人のアーティストの名前は同じですか? – nilesh

答えて

-1

データベースにはどのようにアクセスしますか?あなたはどんな種類のORMを使っていますか?

一般に、トラックごとにアーティストを再度挿入することはできません。

アルバムを挿入するときに、アーティストが既に存在する場合は、テーブルを参照する必要があります。存在する場合は、そのIDを取り出し、トラックを挿入するときに再利用します。アーティストがまだ存在しない場合は、それを挿入し、artist_idを保存して、トラックリストの反復処理を行い、artist_idを使用して各トラックを挿入します。

0

データベース設計によれば、正常に動作するはずです。私はすべてのidsprimary keyそれぞれの表であることを推測しています。アーティスト名にはUNIQUEという制約も与えます。また、スクリプトを使用してテーブルを作成する場合は、入力後にコミットするようにしてください。これでCANTは既に存在する名前を挿入します。また、外部キーを作成します。このサンプルコードはpython3のsqliteでうまく動作します。

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() 

・ホープ、このことができます:)

+0

これは役に立ちますが、このクエリ 'insert into albums(artist_id)values(1)'は実行時にartist_idを知っている必要があります。私の目標は、autoincrementを使用してそれぞれの固有のエントリを持つ主キーを生成することでした。私が間違っている場合は私を修正しますが、これを行うには、アーティストがすでに存在するかどうかを確認してから、同じクエリでプライマリキーを使用する必要はありませんか? このプロジェクトのポイントは、私が聴いている音楽をモニターしてから、毎日このデータベースに曲を追加することです。私は絶えずエントリーを追加しているので、各エントリーが避けられない前に重複をチェックしていますか? – jl8n

0

をなぜ重複を防ぐために、データベースの構造に依存していますか?
これは、データをロードするときに簡単に実行されます。
次はsqlite3を使用して、おそらく改善が必要されています

データファイルその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 

コード:
をアーティストがそれが依存している
異なっている場合、これは重複したアルバム名を許可しません新しいレコードを挿入するときのキーのautoincrement

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 
関連する問題