python|sqlalchemy|联表查询

摘要:
2020-04-20|要改进,请提供一个py文件,该文件可以直接运行以创建classAccount(db.Model):__tablename__='account'id=db.Column(db.INT,primary_key=True,nullable=False,autoincrement=True)昵称=db.Colum(db.VARCHAR(64),nullaable=False,u

2020-04-20|待完善,给出可以直接运行的py文件

建立表的类

class Account(db.Model):
    __tablename__ = 'account'
    id = db.Column(db.INT, primary_key=True, nullable=False, autoincrement=True)
    nickname = db.Column(db.VARCHAR(64), nullable=False, unique=True)
    def __repr__(self):
        return '' % (self.gameuid)

class Bind(db.Model):
    __tablename__ = 'bind'
    id = db.Column(db.BIGINT, primary_key=True, autoincrement=True)
    # 绑定者和被绑定者的 gameuid; 建立了外键关联; 记录两个用户之间的关系; 再不添加外键,也实现联表查询(已经确认)
    fromid = db.Column(db.BIGINT, db.ForeignKey('account.id'), nullable=False)
    toid = db.Column(db.BIGINT, db.ForeignKey('account.id'), nullable=False)
    def __repr__(self):
        return '' % (self.fromid, self.toid)

联表查询: 基础

# 查询id=1000的账号下绑定的所有账号
# first: 不使用join
res = db.session.query(Bind.id, Account.id).filter(Bind.fromid == Account.id)filter(Bind.id==1000).all()

# 查看对应的sql语句的方法: print( db.session.query(Bind.id, Account.id).filter(Bind.fromid = Account.id))
# 此时使用的是where语句

# second:使用join
db.session.query(Bind.id, Account.nickname).join(Account, Account.id==Bind.fromid).filter(Bind.toid==1000).all()
# ps: join语句中的表名称,必须是在query中后出现的表的名称,否则会报错;query中的表的顺序决定了链接表的顺序
# ps: 链接超过两张表,可以在join得到的结果后面继续使用join,也可以在filter后面继续使用join;无限链接下去。

联表查询: 筛选特定字段

res = Account.query.join(Bind, Bind.fromid == Account.gameuid). 
    filter(Bind.toid == 1000). 
    with_entities(Bind.bindid, Account.nickname).all()

# 返回的结果: 不是python的truple;实际上是<class 'sqlalchemy.util._collections.result'>,它是 AbstractKeyedTuple 对象,拥有一个 keys() 方法,可以转化为字典
[(2, '玩家10001'), (3, '玩家10002')]

[dict(zip(item.keys(), item)) for item in res]
# 结果
[{'bindid': 2, 'nickname': '玩家10001'}, {'bindid': 3, 'nickname': '玩家10002'}]

实战案例

# 表 ClueInfo, ClueTypeInfo, BelongsToRelation
# 还使用到子查询; in_ or_ and_ ,子查询不能使用first,all等获取结果
# filter_by()只允许输入一个参数;当使用or_ and_ 时候,需要使用filter from sqlalchemy.testing import in_, and_ space_list = db.session.query(ClueInfo, ClueTypeInfo).join(ClueTypeInfo, ClueTypeInfo.id == ClueInfo.clueObjectTypeId) .filter(or_(ClueTypeInfo.typeTitle == 'project_space', ClueTypeInfo.typeTitle == 'private_space')) .filter(ClueInfo.id.in_(db.session.query(BelongsToRelation.objectId) .filter(BelongsToRelation.belongsToClueId == user.id) .filter( or_(BelongsToRelation.objectTypeId == 'edeb2efc8a4cc60abe50fe5c42f940da', BelongsToRelation.objectTypeId == 'ff7dc456c24a3662a55b23f36166e71e')) .filter(BelongsToRelation.softDeleted == 0))).all()
# 返回的结果是列表

[(<ClueInfo benny>, <ClueTypeInfo project_space>), (<ClueInfo 大市场一楼>, <ClueTypeInfo project_space>)]

参考文章链接:

https://pdf-lib.org/Home/Details/7409

免责声明:文章转载自《python|sqlalchemy|联表查询》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇实现WinForm窗体的美化(借助第三方控件)WebStorm常用快捷键总结下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

python 字典 拼接SQL语句

def gen_sql(table_name, data):     """   :param table_name: 表名称   :param data: 字典对象 key为字段(要与数据库字段一样), value为插入值   :return: 拼接好的sql语句   """   fields = list()   values = list()   ...

tcp与http协议 以及python的实现

htpp协议Rquest Headers格式: 请求方法空格URL空格协议版本回车符换行符 头部字段名:值回车符换行符 ··· 头部字段名:值回车符换行符 回车符换行符 请求数据 socket网络聊天 服务端 #sokcet服务断 importsocket importthreading server =socket.socket() #绑定到0.0.0....

Python列表操作与深浅拷贝(5)——数字处理函数、类型判断、列表链表队列栈

python内建数据结构 分类 数值型:  int  float  complex  bool 序列对象: 字符串str  列表list  元组tuple 键值对:  集合set  字典dict 数值型 (list float complex bool都是class) int:python3 中 int 就是长整型,没有大小限制 float:支持十进制和科...

python服务器环境搭建——安装相关软件

在上一篇我们在本地的虚拟服务器上安装好CentOS7后,我们的python web服务、自定义的python service或python脚本需要在服务器上运行,还需要在服务器安装各种相关的软件才行,一般来说,想要实现自动化部署需求,还需要安装nginx、svn、uwsgi、python3.0(系统自带python2.7.5)、supervisor、pos...

python轻量级orm框架 peewee常用功能速查

peewee常用功能速查 peewee 简介 Peewee是一种简单而小的ORM。它有很少的(但富有表现力的)概念,使它易于学习和直观的使用。 常见orm数据库框架 Django ORM peewee SQLAlchemy Django ORM 优点:易用,学习曲线短和Django紧密集合,用Django时使用约定俗成的方法去操作数据库缺点:Quer...

自动化运维工具Ansible详细部署 (转载)

自动化运维工具Ansible详细部署 标签:ansible 原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://sofar.blog.51cto.com/353572/1579894 ==================================================...