簡體   English   中英

用 python 刪除 sql 代碼並從 JOIN 中選擇

[英]deleting sql code with python and selecting from JOIN

我剛開始使用 Python,並且已經了解 SQL 的基礎知識。在這段代碼中,我嘗試連接表並測試 python,但是我有兩個無法解決的問題。 問題 1) 每次我運行我的代碼時,數據都會被輸入一個新的。 我明白為什么會發生這種情況,但是為了避免這種情況,我需要刪除重復數據的代碼。 有人可以寫一個可能的解決方案嗎? 問題 2) 當我使用 JOIN 查詢並嘗試 select first_name 和 job 時,我收到一條錯誤消息,告訴我 first_name 是未知列??? 這是我的代碼:

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

您的查詢中有兩個表,字段為“名字”。 您的查詢需要指定要引用的查詢。

將您的 select 行替換為

SELECT jobs.first_name, job FROM family....

您已經在使用 CREATE TABLE IF NOT EXISTS,但將所有四個創建/插入函數包裝到數據庫內容檢查中可能更容易:

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'""")

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM