Moje pytanie brzmi, jak skonfigurować model deklaracji SQLAlchemy, do którego można uzyskać dostęp z klasy QTableView PySide.Projekt "modelu" dla QTableView w PySide + SQLAlchemy.
Po prostu staram się przede wszystkim wdrożyć przód dla Object Relational tutorial
Niestety mam kilka punktów w błąd. Spróbuję wyjaśnić, gdzie jestem.
Mam śledzony samouczek SQLAlchemy do punktu, w którym mam dwie powiązane tabele i można manipulować/kwerendy tych bez żadnych problemów. Próba ustanowienia QTableView class najwyraźniej wymaga setData() method z mojego własnego modelu lub użycie domyślnego modelu wymaga setItem() method.
Pytanie więc, jak zaprojektować model. Zakładam, że oznacza to zdefiniowanie jednej z tych dwóch metod do zapytania/modyfikacji bazy danych. Nie wiem, jak to zrobić.
Model ma być jak imię i nazwisko użytkownika powtarzane w kilku wierszach, dopóki wszystkie adresy nie zostaną wyświetlone, a następnie przejść do następnego użytkownika. Mogę to zrobić za pomocą zagnieżdżonych pętli, aby wydrukować to w wierszu polecenia, ale nie myślę, że zrobienie dużej listy jest drogą do zrobienia, ponieważ wydaje się, że pokonanie punktu posiadania bazy danych w pierwszej kolejności ...
Nie wiem też, co się stanie, gdy baza danych się powiększy, czy cała tabela zostanie utworzona i będzie przechowywana w pamięci, czy też Qt wczytuje wiersze i kolumny, gdy będą one wyświetlane, gdy użytkownik przewinie?
Dużo tekstu tutaj przykro, ale staram się być jasne. Jeśli są dodatkowe rzeczy, które mógłbym dodać, daj mi znać. Lub jeśli jestem całkowicie na niewłaściwym torze ...
from PySide import QtCore, QtGui
from sqlalchemy import Column, Integer, String, Text, Sequence, ForeignKey, Date, Boolean, create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, relationship, backref, aliased
import datetime
engine = create_engine('sqlite:///reminder.db')
Base = declarative_base()
class User(Base):
__tablename__ = 'users_db'
id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
lastname = Column(String)
firstname = Column(String)
contact = Column(String)
history = Column(Text)
notes = Column(Text)
addresses = relationship('Address', order_by='Address.id',
backref='user', cascade='all, delete, delete-orphan')
def __init__(self, firstname, lastname, contact):
self.firstname = firstname
self.lastname = lastname
self.contact = contact
def __repr__(self):
return "<User('{0}', '{1}', '{2}')>".format(self.firstname, self.lastname, self.contact)
class Address(Base):
__tablename__ = 'addresses_db'
id = Column(Integer, primary_key=True)
address = Column(String(150))
date = Column(Date)
check1 = Column(Boolean)
check2 = Column(Boolean)
user_id = Column(Integer, ForeignKey('users_db.id'))
def __init__(self, address, date):
self.address = address
self.date = date
self.check1 = False
self.check2 = False
def __repr__(self):
return "<Address('{0}', '{1}')>".format(self.address, self.date)
if __name__ == '__main__':
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
header = [User.firstname, User.lastname, nextaddressfromUser]
>>> for user in session.query(User).all():
... for addr in user.addresses:
... print user.firstname, user.lastname, addr.address
Wygląda dobrze. Jest już za późno, więc nie może tego teraz wypróbować. Czy możesz wyjaśnić table_item.setData (QtCore.Qt.UserRole + 1, użytkownik)? – jbbiomed
Jest to używane w celu rzeczywistego manipulowania obiektem użytkownika, a nie tylko wyświetlania jego nazwy ... (na przykład). Zaktualizuję moją odpowiedź, aby pokazać przykład. – jadkik94
fajne dzięki za wyjaśnienie. Przypuszczam, że jesteś zwięzły w pierwszym opublikowanym przez ciebie kodzie i mogę łatwo dodać odniesienie do właściwego użytkownika we właściwym miejscu i nie ma żadnej magii, której używasz. – jbbiomed