私の質問は、PySideのQTableViewクラスからアクセスできるSQLAlchemy宣言型モデルを実際にセットアップする方法です。私は基本的にObject Relational tutorialPySide + SQLAlchemyのQTableView用の「モデル」の設計。
のフロントエンドを実装しようとしている
残念ながら、私は混乱のいくつかのポイントがあります。私はどこにいるのか説明しようとします。
SQLAlchemyのチュートリアルでは、関連する2つのテーブルがあり、問題のないテーブルを操作/照会できます。確かにQTableView classを確立しようとすると、私自身のモデルでsetData() methodが必要です。または、デフォルトモデルを使用するにはsetItem() methodが必要です。
ですから、モデルをどのように設計するのかという疑問があります。私は、データベースを照会/変更するための2つの方法の1つを定義することを意味します。私はこれを行う正しい方法を知らない。
モデルは、すべてのアドレスが表示されるまで少数の行で繰り返されるUser firstnameとlastnameのようになっていて、次のUserに移動します。これをプロンプトで印刷するためにネストされたforループでこれを行うことができますが、大きなリストを作成することが最初の場所にデータベースを持つ点を打ち負かすように見える方法だとは思わない...
また、データベースが大きくなり、テーブル全体がインスタンス化されてメモリに保持されたり、ユーザーがスクロールしたときに表示される行と列を読み込んだりしますか?
ここにテキストがたくさん残っていますが、明確にしようとしています。追加のものがあれば、私に知らせてください。または、私が間違ったトラックに完全に入っている場合....
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
これは実際にUserオブジェクトを操作できるように使用されています。私は例を示すために私の答えを更新します。 – jadkik94
説明してくれてありがとう。私はあなたが投稿した最初のコードでは簡潔であることを前提としており、適切なユーザーへの参照を適切な場所に簡単に追加することができ、使用している魔法はありません。 – jbbiomed