На самом деле мой вопрос заключается в том, как настроить декларативную модель SQLAlchemy, к которой можно получить доступ из класса PySide QTableView.
Я просто пытаюсь реализовать внешний интерфейс для Учебника по реляционным объектам
К сожалению, у меня есть несколько непоняток. Я попытаюсь объяснить, где я нахожусь.
Я следовал руководству по SQLAlchemy до такой степени, что у меня есть две связанные таблицы, и я могу манипулировать/запрашивать их без проблем. Попытка установить класс QTableView, по-видимому, требует метода setData()с моей собственной моделью, или для использования модели по умолчанию требуется метод setItem().
Итак, вопрос в том, как спроектировать модель. Я предполагаю, что это означает определение одного из этих двух методов для запроса/изменения базы данных. Я не знаю, как это правильно сделать.
Модель должна быть похожа на имя пользователя и фамилию, повторяющиеся в нескольких строках, пока не будут показаны все адреса, а затем перейти к следующему пользователю. Я могу сделать это с помощью вложенных циклов 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 "".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 "".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