Θα χρειαστώ τα φώτα σας για άλλη μια φόρα.
Ένα κομμάτι κώδικα, το οποίο πραγματικά με έχει βγάλει έξω απ' τα ρούχα μου:

(χρειάζεται sqlalchemy για να τρέξει)
- Κώδικας: Επιλογή όλων
#!/usr/bin/python3
from sqlalchemy import create_engine, Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.orm import relationship, backref
engine = create_engine('sqlite:///:memory:')
metadata = MetaData()
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Categories(Base):
__tablename__ = 'categories'
id = Column(Integer, primary_key=True)
name = Column(String, nullable=False)
def __init__(self, name):
self.name = name
class Epafes(Base):
__tablename__ = 'epafes'
id = Column(Integer, primary_key=True)
name = Column(String)
category = Column(Integer, ForeignKey('categories.id'))
category_relation = relationship(Categories)
def __init__(self, name=None, category=None):
self.name = name
self.category = category
metadata = Base.metadata
metadata.create_all(engine)
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
kwstas = Epafes() # Προσθήκα επαφής χειροκίνητα.
kwstas.name = 'Kwstas'
kwstas.category = 'filoi'
categ = Categories(kwstas.category)
categ.epafes = [kwstas]
session.add(kwstas)
session.add(categ)
session.commit()
def prosthiki():
print('\nΕισάγεται τα στοιχεία της επαφής: \n')
epafi = Epafes()
epafi.name = input('Όνομα: ')
epafi.category = input('Κατηγορία: ')
cat = Categories(epafi.category)
cat.epafes = [epafi]
session.add(epafi)
session.add(cat)
session.commit()
while True:
apantisi = input()
if apantisi == '1':
prosthiki()
elif apantisi == '2':
for categ in session.query(Categories):
for epafi in categ.epafes:
print(epafi.name)
Μες τον κώδικα έχω δηλώσει χειροκίνητα μια επαφή με όνομα μεταβλητής kwstas και μία κατηγορία επίσης, ενώ τα έχω προσθέσει και τα δύο στην session.
Αν πατήσω '2' για να εμφανίσω τα ονόματα των επαφών σε κάθε κατηγορία όταν τρέχει το πρόγραμμα θα μου εμφανίσει το όνομα του Κώστα το οποίο και περιμένω. Καλά ως εδώ.
Αν στην συνέχεια πατήσω '1' και κάνω προσθήκη επαφής και ξαναπατήσω '2' θα πάρω AttributeError.
Θα εκτυπώσει κανονικά το όνομα του Κώστα αλλά στην δεύτερη κατηγορία θα μου πει ότι δεν υπάρχει Categories.epafes!
Γιατί γίνεται αυτό; Αφού κάνω ακριβώς την ίδια διαδικασία και τις δύο φορές.
Επίσης, αν αλλάξουμε τον κώδικα της συνάρτησης prosthiki() σε:
- Κώδικας: Επιλογή όλων
def prosthiki():
print('\nΕισάγεται τα στοιχεία της επαφής: \n')
epafi = Epafes()
epafi.name = input('Όνομα: ')
epafi.category = input('Κατηγορία: ')
cat = Categories(epafi.category)
cat.epafes = [epafi]
session.add(epafi)
session.add(cat)
session.commit()
for categ in session.query(Categories):
for epafi in categ.epafes:
print(epafi.name)
και πατήσω '1' για προσθήκη, την πρώτη φορά που θα το κάνω θα μου εμφανίσει κανονικά το όνομα της επαφής και θα βρει το Categories.epafes της επαφής η οποία μόλις δηλώθηκε!
Αλλά, αν δεν κλείσω το πρόγραμμα και ξαναπατήσω '1', αφού κάνω την προσθήκη θα μου βγει πάλι το AttributeError γιατί δεν θα βρίσκει το Categories.epafes της επαφής που καταχωρήθηκε νωρίτερα!

Πρώτη φορά νευριάζω τόσο με μερικές σειρές κώδικα.
Ευχαριστώ εκ των προτέρων.