2011-01-04 2 views
2

Привет Я пишу этот небольшой интерфейс для базы данных клиентов для своего рабочего места. Нам просто нужно было что-то легкое и простое отслеживать клиентов и задачи и прочее.Python + SQlite3, используя внешние ключи

Это становится путаным, потому что я изучаю python и SQL в одно и то же время, но я бы хотел, чтобы часть отношений внешних ключей работала гладко, прежде чем я продолжу.

То, что я хочу сделать, это быть в состоянии иметь много задач, возложенных на 1 клиента

вот пример:

conn = sqlite3.connect(':memory:') 
cur = conn.cursor() 
cur.execute('''CREATE TABLE customers (custid INTEGER PRIMARY KEY AUTOINCREMENT, name TEXT, phone TEXT, email TEXT, notes TEXT)''') 
cur.execute('''CREATE TABLE tasks (taskid INTEGER PRIMARY KEY AUTOINCREMENT, title TEXT, notes TEXT, taskcust INTEGER, FOREIGN KEY(taskcust) REFERENCES customer(custid))''') 

cur.execute('''INSERT INTO customers (name, phone, email, notes) VALUES('Jeff', '555555', '[email protected]', 'balblalal')''') 
cur.execute('''INSERT INTO tasks (title, notes, taskcust) VALUES ('Toshiba A200', 'replace RAM, add 2 gigs', 1)''') 
cur.execute('''INSERT INTO tasks (title, notes, taskcust) VALUES ('WD External HDD', 'Diagnose, tick of death, hdd probably dead', 1)''') 

Так что теперь у меня есть 2 задачи, поставленные перед «Jeff». Что, если я хочу напечатать контактную информацию Джеффа и все его задачи?

cur.execute('''SELECT * FROM customers where custid=1''') 
for row in cur: 
    for i in row: 
     print i 
cur.execute('''SELECT * FROM tasks WHERE taskcust=1''') 
for row in cur: 
    for i in row: 
     print i 

Я делаю это правильно?

ответ

2

Не отступа

for row in cur: 
     for i in row: 
      print i 

ниже cur.execute('''SELECT * FROM tasks WHERE taskcust=1''')

Кроме того, я думаю, что все работает так, как вы хотите. Внешние ключи полезны, потому что теперь, если вы хотите найти клиента, который попросил вас «заменить RAM, добавить 2 концерта», вы можете вернуться к записи клиента.

+0

спасибо, что отступ был просто опечаткой :) Просто хотел убедиться, что я делаю это правильно. –

+0

Вот что я понял. Один быстрый запрос, прежде чем вы получите его, в зависимости от вашей системы баз данных, будут введены внешние ключи, поэтому, если клиент с данным идентификатором не существует, когда вы пытаетесь вставить задачу, БД может выдать ошибку. – mklauber

+0

Я вроде думаю, что внешние ключи не соблюдаются должным образом. Я могу сделать задачу для клиента, которого не существует, и если я удалю клиента, задачи, назначенные ему, останутся: S Похоже, что иностранец просто действует как обычный целочисленный столбец ... –

Смежные вопросы