私の質問は、PySide の QTableView クラスからアクセスできる SQLAlchemy 宣言型モデルをセットアップする方法です。
オブジェクトリレーショナルチュートリアルのフロントエンドを本質的に実装しようとしています
残念ながら、私にはいくつかの混乱点があります。私がどこにいるかを説明しようと思います。
私は SQLAlchemy チュートリアルに従って、関連する 2 つのテーブルがあり、それらを問題なく操作/クエリできるようになりました。QTableView クラスを確立しようとすると、明らかに自分のモデルで setData() メソッドが必要になるか、デフォルト モデルを使用するには setItem() メソッドが必要になります。
したがって、問題はモデルをどのように設計するかです。これは、データベースを照会/変更するための 2 つのメソッドのいずれかを定義することを意味すると思います。これを行う正しい方法がわかりません。
モデルは、すべての住所が表示されるまで数行で繰り返される User の姓と名のようなものであると想定されており、その後、次の User に移動します。プロンプトでこれを出力するためにネストされた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