我的问题实际上是如何设置可以从 PySide 的 QTableView 类访问的 SQLAlchemy 声明性模型。
不幸的是,我有几点困惑。我会试着解释我在哪里。
我遵循了 SQLAlchemy 教程,直到我有两个相关的表,并且可以毫无问题地操作/查询这些表。尝试建立QTableView 类显然需要使用我自己的模型的setData() 方法,或者使用默认模型需要setItem() 方法。
所以问题是如何设计模型。我认为这意味着定义这两种方法之一来查询/修改数据库。我不知道这样做的正确方法。
该模型应该像 User firstname 和 lastname 在几行上重复,直到显示所有地址,然后转到下一个 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