Problem z SQLite - dwie tabele, dwa klucze obce

0

Witajcie,
Walczę z programem, który ma realizować podstawowe operacje CRUD. Niestety model relacji jaki został mi narzucony wygląda następująco: tabela I - klucz obcy do tabeli II, tabela II - klucz obcy do tabeli I. O ile poradziłem sobie z podstawowymi zapytaniami do pojedynczej tabeli, o tyle mam problem z wyświetleniem danych "złożonych" z obu tabeli, np. wyświetlenie działu zarządzanego przez konkretnego użytkownika. Jak się okazuje SQLite nie obsługuje zapętlonych relacji, dlatego w tabeli 'Dzial' nie mogę podać wprost klucza obcego do tabeli 'Pracownik'. Pomysł jaki się pojawił, to użycie dodatkowej tabeli. Czy z Python'owców ktoś może podpowiedzieć coś w temacie?

class database_objModel(Model):  # klasa bazowa
    class Meta:
        database = database_obj

class Dzial(database_objModel):
    iddepartment = PrimaryKeyField(unique=True)
    departmentname = CharField(max_length=100)
    #idmanager = DeferredForeignKey('Pracownik', null=True)
    idmanager = IntegerField()
    address = CharField(max_length=200)
    mainphone = CharField(max_length=100)
    mainmail = CharField(max_length=100)
    mainwww = CharField(max_length=100)
    description = CharField()

class Pracownik(database_objModel):
    iduser = PrimaryKeyField(unique=True)
    #iddepartment = ForeignKeyField(Dzial, to_field="iddepartment")
    iddepartment = IntegerField()
    username = CharField(max_length=100)
    password = CharField(max_length=100)
    firstname = CharField(max_length=100)
    lastname = CharField(max_length=100)
    description = CharField()
    pay = FloatField()
    bonus = FloatField()
    date_of_payment = DateField()
0

Jak się okazuje SQLite nie obsługuje zapętlonych relacji

Ależ oczywiście, że obsługuje:

PRAGMA foreign_keys = ON;
CREATE TABLE foos(id STRING);
CREATE TABLE bars(id STRING);
ALTER TABLE foos ADD COLUMN bar_id STRING REFERENCES bars(id);
ALTER TABLE bars ADD COLUMN foo_id STRING REFERENCES foos(id);
0

Dzięki za odpowiedź. Kiedy jednak próbuję odpalić program, w którym definiuję w klasach szablony tabel jak poniżej, program wykrzacza się:

idmanager = ForeignKeyField(Pracownik, to_field="iduser")

NameError: name 'Pracownik' is not defined

Wiem, że próbuję odwołać się do obiektu klasy, który jeszcze nie wystartował. Ale jak to przeskoczyć z SQLite?
Próbowałem użyć #idmanager = DeferredForeignKey('Pracownik', null=True) ale nie działa...

class Dzial(database_objModel):
    iddepartment = PrimaryKeyField(unique=True)
    idmanager = ForeignKeyField(Pracownik, to_field="iduser")
...
class Pracownik(database_objModel):
    iduser = PrimaryKeyField(unique=True)
    iddepartment = ForeignKeyField(Dzial, to_field="iddepartment")

Python 3.8, peewee-3.11.2, SQLite3

0

Jak przekażesz string zamiast klasy to też nie działą?

class Dzial(database_objModel):
    iddepartment = PrimaryKeyField(unique=True)
    idmanager = ForeignKeyField('app.Pracownik', to_field="iduser")
...
class Pracownik(database_objModel):
    iduser = PrimaryKeyField(unique=True)
    iddepartment = ForeignKeyField('app.Dzial', to_field="iddepartment")
0

Dzięki za odpowiedź, poradziłem sobie w ten sposób:

class Dzial(database_objModel):
	...
    idmanager = DeferredForeignKey('Pracownik', deferrable='INITIALLY DEFERRED')


class Pracownik(database_objModel):
    ...
    iddepartment = ForeignKeyField(Dzial, deferrable='INITIALLY DEFERRED')

1 użytkowników online, w tym zalogowanych: 0, gości: 1