Mi pregunta es realmente cómo configurar un modelo SQLAlchemy-declarativo al que se puede acceder desde la clase QTableView de PySide.Diseño del 'modelo' para QTableView en PySide + SQLAlchemy.
sólo estoy tratando de poner en práctica esencialmente una interfaz del Object Relational tutorial
Por desgracia, tengo un par de puntos de confusión. Trataré de explicar dónde estoy.
He seguido el tutorial de SQLAlchemy hasta el punto en que tengo dos tablas relacionadas y puedo manipular/consultar aquellas sin problemas. Intentar establecer un QTableView class aparentemente requiere un setData() method con mi propio modelo, o usar el modelo predeterminado requiere un setItem() method.
Entonces la pregunta es cómo diseñar el modelo. Supongo que esto significa definir uno de esos dos métodos para consultar/modificar la base de datos. No sé la manera correcta de hacer esto.
Se supone que el modelo es como el nombre de usuario y el apellido repetidos en algunas filas hasta que se hayan mostrado todas las direcciones, luego pase al siguiente usuario. Puedo hacer esto con los bucles anidados para imprimir esto en el prompt, pero no creo que hacer una gran lista es el camino a seguir, ya que eso parece frustrar el punto de tener la base de datos en primer lugar ...
Tampoco sé qué sucederá cuando la base de datos crezca, ¿se crea una instancia de toda la tabla y se mantiene en la memoria o Qt carga filas y columnas cuando aparecen cuando el usuario se desplaza?
Gran cantidad de texto aquí lo siento, pero tratando de ser claro. Si hay cosas adicionales que pueda agregar, házmelo saber. O si estoy totalmente en el camino equivocado ...
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
Se ve bien. Es tarde, así que no puedo probarlo ahora. ¿Puede explicar table_item.setData (QtCore.Qt.UserRole + 1, user) – jbbiomed
Esto se utiliza para que pueda manipular el objeto User y no solo mostrar su nombre ... (por ejemplo). Actualizaré mi respuesta para mostrar un ejemplo. – jadkik94
genial gracias por explicar. Supongo que solo está siendo sucinto en el primer código que publicó y que puedo agregar fácilmente una referencia al usuario correcto en el lugar correcto y que no hay magia que esté usando. – jbbiomed