제 질문은 실제로 PySide의 QTableView 클래스에서 액세스 할 수있는 SQLAlchemy 선언 모델을 설정하는 것입니다. 난 그냥 기본적으로 Object Relational tutorialPySide + SQLAlchemy의 QTableView 용 '모델'디자인.
에 대한 처음과 끝을 구현하기 위해 노력하고있어
불행하게도 나는 혼란의 몇 가지 포인트가 있습니다. 나는 어디에 있는지 설명하려고 노력할 것이다.
SQLAlchemy 튜토리얼을 따라 두 개의 관련 테이블을 가지며 아무 문제없이 조작/쿼리 할 수 있습니다. QTableView class을 설정하려고하면 내 모델에 setData() method이 필요하거나 기본 모델을 사용하려면 setItem() method이 필요합니다.
그래서 모델을 설계하는 방법이 궁금합니다. 나는이 두 가지 방법 중 하나를 데이터베이스 쿼리/수정을 정의하는 것을 의미합니다. 나는 이것을 할 올바른 방법을 모른다.
모델은 모든 주소가 표시 될 때까지 사용자 이름과 성을 몇 줄로 반복 한 다음 다음 사용자로 이동해야합니다. 나는이 작업을 프롬프트에서 인쇄하기 위해 중첩 된 for 루프로 처리 할 수 있지만, 큰 목록을 만드는 것이 처음부터 데이터베이스를 갖는 지점을 무력화시키는 것처럼 보이지는 않는다고 생각합니다.
또한 데이터베이스가 커질 때 어떤 일이 발생할지 모르고, 전체 테이블이 인스턴스화되어 메모리에 보관되거나 사용자가 스크롤 할 때 볼 때 들어오는 행과 열을 Qt로드합니까?
여기에 텍스트가 많이 있지만 죄송합니다. 추가 할 수있는 것이 있으면 알려 주시기 바랍니다. 아니면 내가 완전히 잘못된 트랙에 있다면 ....
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
좋아요. 그것의 늦은 그래서 지금 그것을 시도 할 수 없습니다. 당신이 설명해 줄 수 있습니까? table_item.setData (QtCore.Qt.UserRole + 1, user) – jbbiomed
이것은 실제 사용자 개체를 조작 할 수 있으며 그의 이름을 표시하는 것뿐만 아니라 (예를 들어) 사용할 수 있도록하기 위해 사용됩니다. 나는 예를 보여주기 위해 나의 대답을 업데이트 할 것이다. – jadkik94
설명해 주셔서 감사드립니다. 나는 당신이 게시 한 첫 번째 코드에서 간결한 것으로 보이며 적절한 사용자에게 참조를 쉽게 추가 할 수 있으며 사용중인 마법은 없다고 가정합니다. – jbbiomed