Дизайн «модели» для QTableView в PySide + SQLAlchemy

На самом деле мой вопрос заключается в том, как настроить декларативную модель 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

7
задан MosteM 27 February 2019 в 13:52
поделиться