A PRIMARY KEY uniquely identifies a row. A FOREIGN KEY points at another table. SQLite only enforces FKs if you turn them on.
Goal
Catch IntegrityError and print a successful child row.
import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE cities (id INTEGER PRIMARY KEY, name TEXT UNIQUE)")
con.execute("INSERT INTO cities(name) VALUES ('Nairobi')")
try:
con.execute("INSERT INTO cities(name) VALUES ('Nairobi')")
except sqlite3.IntegrityError as err:
print(type(err).__name__, err)
con.close()import sqlite3
con = sqlite3.connect(":memory:")
con.execute("PRAGMA foreign_keys = ON")
con.execute("CREATE TABLE cities (id INTEGER PRIMARY KEY, name TEXT)")
con.execute("CREATE TABLE sales (city_id INTEGER REFERENCES cities(id), units INTEGER)")
con.execute("INSERT INTO cities VALUES (1, 'Nairobi')")
con.execute("INSERT INTO sales VALUES (1, 12)")
print(con.execute("SELECT * FROM sales").fetchall())
con.close()import sqlite3
con = sqlite3.connect(":memory:")
con.execute("PRAGMA foreign_keys = ON")
con.execute("CREATE TABLE cities (id INTEGER PRIMARY KEY)")
con.execute("CREATE TABLE sales (city_id INTEGER REFERENCES cities(id), units INTEGER)")
try:
con.execute("INSERT INTO sales VALUES (99, 1)")
except sqlite3.IntegrityError as err:
print("blocked", err)
con.close()import sqlite3
con = sqlite3.connect(":memory:")
con.execute("CREATE TABLE t (id INTEGER PRIMARY KEY, name TEXT)")
con.execute("INSERT INTO t(name) VALUES ('Nairobi')")
print(con.execute("SELECT id, name FROM t").fetchall())
con.close()