Есть ли способ предотвратить присоединение JOIN к новым наборам данных со старыми? - PullRequest
1 голос
/ 09 января 2020
conn = sqlite3.connect("lite.db")
    cur = conn.cursor()
    cur.execute("SELECT * FROM database JOIN database1")
    rows = cur.fetchall()
    for row in rows:
        print(row)
        tree.insert("", tk.END, values=row)
    conn.close()

У меня есть две базы данных SQLite3, база данных и база данных1. Когда я присоединяю database1 к базе данных, и пользователь вводит всю информацию, которая будет храниться в базе данных, он присоединяется к ним, как и ожидалось. Однако, если пользователь добавляет новый набор данных, старый набор снова присоединяется к новому набору.

Например, пользователь вводит: Франк в базе данных и Apple в базе данных1 Отображаемые результаты: Франк Apple

пользователь вводит : Уильям в базе данных и Orange в базе данных1 Отображаемые результаты: Фрэнк Эппл Фрэнк Орандж Уильям Орандж Уильям Apple

Как мне остановить базу данных от изменения любых других сохраненных значений?

Ожидается: Фрэнк Эппл Уильям Оранж

1 Ответ

0 голосов
/ 09 января 2020

Вы не присоединяетесь к базам данных, вы присоединяетесь к таблицам. Чтобы использовать несколько баз данных в соединении, вы открываете / соединяете одну базу данных и присоединяете другие базы данных к схеме, чтобы различать их, исходная подключенная база данных будет иметь имя схемы main.

Если вы этого не сделаете предоставьте условия для JOIN, тогда каждая перестановка / комбинация будет результатом.

  • Вы используете ON the_condition(s)

в качестве демонстрации ATTACH и JOIN с и без условий: -

import sqlite3

# First database
connection1 = sqlite3.connect("database")
connection1.execute("CREATE TABLE IF NOT EXISTS table1 (id INTEGER PRIMARY KEY, name TEXT)")
connection1.commit()
connection1.execute("DELETE FROM table1")
connection1.execute("INSERT INTO table1 (name) VALUES('Frank'),('Mary'),('Joan')")
connection1.commit()
cursor = connection1.execute("SELECT * FROM table1")
print("\nData in table1 (in 1st Database)")
rows = cursor.fetchall()
for row in rows:
    print(row)

# Second database
connection2 = sqlite3.connect("database1")
connection2.execute("CREATE TABLE IF NOT EXISTS table2 (id INTEGER PRIMARY KEY, name TEXT)")
connection2.commit()
connection2.execute("DELETE FROM table2")
connection2.execute("INSERT INTO table2 (name) VALUES('Apple'),('Banana'),('Pear')")
connection2.commit()
cursor = connection2.execute("SELECT * FROM table2")
print("\nData in table 2 (in 2nd Database)")
rows = cursor.fetchall()
for row in rows:
    print(row)

connection2.close()

# Attach 2nd database to first
connection1.execute("ATTACH DATABASE 'database1' AS schema_database2")
connection1.commit()
# Use a JOIN
cursor = connection1.execute("SELECT * FROM main.table1 JOIN schema_database2.table2 ON table1.id = table2.id")
print("\nJoin Example 1 (schema not needed)")
rows = cursor.fetchall()
for row in rows:
    print(row)

# If there is no ambiguity of names (table names) then just table name can be used
print("\nJoin Example 2 (schema not needed)")
cursor = connection1.execute("SELECT * FROM table1 JOIN table2 ON table1.id = table2.id")
rows = cursor.fetchall()
for row in rows:
    print(row)

print("\nNatural (not recommended ) Join")
cursor = connection1.execute("SELECT * FROM table1 JOIN table2")
rows = cursor.fetchall()
for row in rows:
    print(row)

Демо Результат: -

Data in table1 (in 1st Database)
(1, 'Frank')
(2, 'Mary')
(3, 'Joan')

Data in table 2 (in 2nd Database)
(1, 'Apple')
(2, 'Banana')
(3, 'Pear')

Join Example 1 (schema not needed)
(1, 'Frank', 1, 'Apple')
(2, 'Mary', 2, 'Banana')
(3, 'Joan', 3, 'Pear')

Join Example 2 (schema not needed)
(1, 'Frank', 1, 'Apple')
(2, 'Mary', 2, 'Banana')
(3, 'Joan', 3, 'Pear')

Without JOIN conditions (joins everything to everything)
(1, 'Frank', 1, 'Apple')
(1, 'Frank', 2, 'Banana')
(1, 'Frank', 3, 'Pear')
(2, 'Mary', 1, 'Apple')
(2, 'Mary', 2, 'Banana')
(2, 'Mary', 3, 'Pear')
(3, 'Joan', 1, 'Apple')
(3, 'Joan', 2, 'Banana')
(3, 'Joan', 3, 'Pear')

Process finished with exit code 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...