2017-12-17 7 views
1

私はPythonを使い始めたばかりですが、すでにSQLの基礎を知っています。このコードではテーブルに参加しようとしていますが、Pythonをテストするだけですが、私は解決できない2つの問題があります。 問題1)コードを実行するたびに、データが新しいものになります。私はこれがなぜ起こっているのか理解していますが、これを避けるためには重複データを削除するコードが必要です。誰かが可能な解決策を書くことができますか? 問題2)JOINクエリを使用してfirst_nameとjobを選択しようとすると、私にfirst_nameが不明な列であるというエラーメッセージが表示されます??? これは私のコードです:PythonでSQLコードを削除し、JOINから選択する

import sqlite3 
conn = sqlite3.connect('learning_sql') 
c = conn.cursor() 

def create_table1(): 
    c.execute('CREATE TABLE IF NOT EXISTS family (first_name TEXT, last_name TEXT, date_of_birth TEXT, age INTEGER)') 

def create_table2(): 
    c.execute("CREATE TABLE IF NOT EXISTS jobs (first_name TEXT, last_name TEXT, job TEXT)") 

def data_entry1(): 
    c.execute("INSERT INTO family VALUES ('Sven','Niles','31-03-2001', 16)") 
    c.execute("INSERT INTO family VALUES ('Max','Niles','10-12-2005', 12)") 
    c.execute("INSERT INTO family VALUES ('David','Niles','18-01-1971', 46)") 
    c.execute("INSERT INTO family VALUES ('Katja', 'Niles', '16-08-1978', 39)") 

def data_entry2(): 
    c.execute("INSERT INTO jobs VALUES ('Sven', 'Niles', 'NO')") 
    c.execute("INSERT INTO jobs VALUES ('Max', 'Niles', 'NO')") 
    c.execute("INSERT INTO jobs VALUES ('David', 'Niles', 'YES')") 
    c.execute("INSERT INTO jobs VALUES ('Katja', 'Niles', 'YES')") 

def read_from_db(): 
    c.execute("SELECT first_name, job FROM family JOIN jobs ON jobs.first_name = family.first_name WHERE job = 'YES'") 
    data = c.fetchall() 
    print (data) 
    for row in data: 
     print (row) 

create_table1() 
create_table2() 
data_entry1() 
data_entry2() 
read_from_db() 

これは私が経験していますエラーメッセージは次のとおりです。

Traceback (most recent call last): 
    File "/home/pi/Desktop/praciticing_sql.py", line 34, in <module> 
    read_from_db() 
    File "/home/pi/Desktop/praciticing_sql.py", line 24, in read_from_db 
    c.execute("SELECT first_name, job FROM family JOIN jobs ON jobs.first_name = family.first_name WHERE job = 'YES'") 
sqlite3.OperationalError: ambiguous column name: first_name 
+0

_exact_エラーを含めてください。 –

+0

トレースバック(最新の呼び出しの最後): read_from_db() ファイル "/home/pi/Desktop/praciticing_sql.py"、24行目で ファイル "/home/pi/Desktop/praciticing_sql.py"、ライン34、 、in read_from_db sqlite3.OperationalError:あいまいな列名:ファーストネーム –

+0

ようこそ!こんにちは、おはようございます。ここに示すように、正確なエラーは重要です。 "あいまい"は未知のものとは非常に異なっています。あなたの投稿の本文にコメントを付けずに、常に正確なエラーを提供してください。 –

答えて

1

あなたは、フィールド「ファーストネーム」を使用して、クエリで2つのテーブルを持っています。照会する照会を指定する必要があります。

あなたはまだないが存在する場合はCREATE TABLEを使用しているが、すべての4つが作成/ラップする方が簡単かもしれない家族からジョブ....

0

SELECT jobs.first_nameであなたの選択ラインを交換してくださいデータベースの内容のチェックへの挿入機能:

if not table_exists(conn, "family"): 
    conn.execute("BEGIN") 
    with conn: 
     create_table1() 
     create_table2() 
     data_entry1() 
     data_entry2() 

read_from_db() 

それは両方のテーブルに発生するため、列名first_nameがあいまいです。 代わりにUSINGを使用すると、重複する列が自動的に削除されます。

c.execute("""SELECT first_name, job 
      FROM family 
      JOIN jobs USING (first_name) 
      WHERE job = 'YES'""") 
関連する問題