Python Sqlalchemy查询多个问题求助,pythonsqlalchemy,class Messag
Python Sqlalchemy查询多个问题求助,pythonsqlalchemy,class Messag
class MessageLog(Base):__tablename__ = 'messagelogs'id = Column(Integer, primary_key=True)receiver_id = Column(Integer, ForeignKey('users.id'))message_id = Column(Integer, ForeignKey('messages.id'), nullable=True)messagelog_status = Column('messagelog_status', Enum('unread', 'read', 'delete'), nullable=False)message = relationship("Message", backref="receivers")receiver = relationship("User", backref=backref("receive_messages", cascade="all, delete, delete-orphan"))class Message(Base):__tablename__ = 'messages'id = Column(Integer, primary_key=True) sender_id = Column(Integer, ForeignKey('users.id'))body = Column(String(256), nullable=False)type = Column('message_types', Enum('private', 'public', 'global'), nullable=False)posted_at = Column(DateTime, default=func.current_timestamp())message_status = Column('message_status', Enum('draft', 'sent', 'deleted'), nullable=False)sender = relationship("User", backref="sent_messages")
以上是站内信相关的模型,基于这篇文章
http://www.cnblogs.com/hejiaquan/archive/2012/04/07/2435817.html
用户登录,查询未读信件,推送消息。
系统消息只插入Message表, type=global。
查询的时候,保存在Message表里但又不在MeesageLog里面的message记录是系统站内信。
如何一次查询,即可得到(MessageLog.receiver_id=logged_in.id) 和 系统消息里面的所有未读记录?
#
追加问题:
两个人的来往私信, 如何查询
session.query(MessageLog, Message).filter(.message_id == ..id)收件人=我,发件人=对方 || 收件人=对方,发件人=我
#
追加问题2:
如何在Sqlalchemy里面查询的时候,动态地插入一条数据??
#
追加问题3:
如何查询我有多少联系人?(给我发信的人 + 接收我信件的人)
尝试回答一下。
我觉得这样的设计,把问题复杂化了。为什么不只做一张表呢?Message这张表,只有 sender_id,没有 receiver_id。用户 A 给用户 B 发消息,程序要操作两张表(message 和 messagelog)?好奇怪。
我认为更好的设计是只有一张表,包含了 sender_id、reciever_id、message_status、messagelog_status 等;
pythonclass Message(Base): __tablename__ = 'messages' id = Column(Integer, primary_key=True) sender_id = Column(Integer, ForeignKey('users.id')) receiver_id = Column(Integer, ForeignKey('users.id')) # 新增 body = Column(String(256), nullable=False) type = Column('message_types', Enum('private', 'public', 'global'), nullable=False) posted_at = Column(DateTime, default=func.current_timestamp()) message_status = Column('message_status', Enum('draft', 'sent', 'deleted'), nullable=False) messagelog_status = Column('messagelog_status', Enum('unread', 'read', 'delete'), nullable=False) # 新增
So,问题解析和解答:
如何一次查询,即可得到(MessageLog.receiver_id=logged_in.id) 和 系统消息里面的所有未读记录?
也即 ** 得到当前登录用户(loggined_id)应该收到的两类消息:系统消息、指定发给 TA 的。 **
pythonimport sqlalchemy as samessages = session.query(Message).filter(sa.or_(Message.receiver_id == logged_in.id,sa.and_(Message.type=='global',Message.messagelog_status=='unread')))
** 两个人的来往私信 **
pythonimport sqlalchemy as sauser_id_a = 1user_id_b = 2messages = session.query(Message).filter(sa.or_(sa.and_(Message.sender_id==user_id_a,Message.receiver_id=user_id_b),sa.and_(Message.sender_id==user_id_b,Message.receiver_id=user_id_a)))
** 如何在Sqlalchemy里面查询的时候,动态地插入一条数据?**
交给接口去处理。callback 什么的。
另外,不建议在 sender_id 和 receiver_id 处使用 ForeignKey,就直接 Integer 好了。
我觉得楼主的表设计的很好,相当于做了一个索引表,数据比较小,加索引,加cache都很好,很适合扩展,把大的字段拆分出去,查询的时候也能加快效率
不适合分2个表。
编橙之家文章,
相关内容
- 想把单行文本文件变成两行对齐的格式,python源码应该怎
- python怎么样把减价乘除变成变量再回来,python乘除,a
- 哪个python api接口并发测试工具好,pythonapi,目前开发的
- Python中文字符用split分隔可行吗?,pythonsplit,我的str="【
- Python windows下与sh相似的模块是什么?,pythonsh,sh模块貌似
- 求推荐个好的开源erp系统,个好开源erp系统,因为业务需
- 使用Mezzanine中文站点有哪些,mezzanine中文站点,Mezzanin
- Python requests库页网页抓取乱码问题,pythonrequests,我在开
- 怎么样可以有效避免MongoDB注入时产生的一系列问题,
- python 3.3.2没有urllib2库吗?,3.3.2urllib2,python代码:imp
评论关闭