sql & sqlalchemy join多个表

# 连接两个数据表的用法:
     FROM Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort

# 语法格式可以概括为:
     FROM 表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号
   
# 连接三个数据表的用法:
     FROM (Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel

# 语法格式可以概括为:
     FROM (表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号
   
# 连接四个数据表的用法:
     FROM ((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity

# 语法格式可以概括为:
     FROM ((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号
   
# 连接五个数据表的用法:
     FROM (((Member INNER JOIN MemberSort ON Member.MemberSort=MemberSort.MemberSort) INNER JOIN MemberLevel ON Member.MemberLevel=MemberLevel.MemberLevel) INNER JOIN MemberIdentity ON Member.MemberIdentity=MemberIdentity.MemberIdentity) INNER JOIN Wedlock ON Member.Wedlock=Wedlock.Wedlock

# 语法格式可以概括为:
     FROM (((表1 INNER JOIN 表2 ON 表1.字段号=表2.字段号) INNER JOIN 表3 ON 表1.字段号=表3.字段号) INNER JOIN 表4 ON Member.字段号=表4.字段号) INNER JOIN 表5 ON Member.字段号=表5.字段号

example

select resource_idc.uuid, resource_idc.name, resource_cabinet.uuid, resource_cabinet.alias from resource_idc 
    INNER JOIN resource_cabinet ON resource_idc.uuid = resource_cabinet.idc_uuid
order by resource_idc.uuid, resource_cabinet.alias;
+--------------------------------------+--------------+--------------------------------------+---------+
| uuid                                 | name         | uuid                                 | alias   |
+--------------------------------------+--------------+--------------------------------------+---------+
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 66f03a52-7716-454c-b69b-77863b40f871 | wxxq-b2 |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | ea6c9cf9-aa67-429a-b934-c602c7ffcf47 | wxxq-b3 |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | fb6e260a-e4c0-43d4-b00a-f33d41fee0de | wxxq-b4 |
| ffdba1b7-6f88-4f78-a1de-b737e682642b | 北京铜牛     | 6b54116c-c6d6-4901-85af-c956d09cfbd5 | bjtn-a1 |
+--------------------------------------+--------------+--------------------------------------+---------+
select resource_idc.uuid, resource_idc.name, resource_cabinet.uuid, resource_cabinet.alias, resource_rack.uid, resource_rack.host_uuid 
from (resource_idc INNER JOIN resource_cabinet ON resource_idc.uuid = resource_cabinet.idc_uuid)
    INNER JOIN resource_rack ON resource_cabinet.uuid = resource_rack.cabinet_uuid
where resource_cabinet.uuid='2c71ecba-4b14-4b94-a623-1f6154b740aa'
order by resource_rack.uid;
+--------------------------------------+--------------+--------------------------------------+---------+------+-----------+
| uuid                                 | name         | uuid                                 | alias   | uid  | host_uuid |
+--------------------------------------+--------------+--------------------------------------+---------+------+-----------+
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    1 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    2 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    3 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    4 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    5 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    6 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    7 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    8 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |    9 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   10 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   11 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   12 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   13 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   14 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   15 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   16 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   17 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   18 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   19 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   20 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   21 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   22 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   23 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   24 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   25 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   26 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   27 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   28 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   29 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   30 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   31 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   32 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   33 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   34 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   35 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   36 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   37 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   38 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   39 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   40 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   41 | NULL      |
| eb4fb047-a4fd-44c2-9f10-15758187417a | 无锡新区     | 2c71ecba-4b14-4b94-a623-1f6154b740aa | wxxq-b1 |   42 | NULL      |
+--------------------------------------+--------------+--------------------------------------+---------+------+-----------+

http://stackoverflow.com/questions/27900018/flask-sqlalchemy-query-join-relational-tables
many2many query
http://stackoverflow.com/questions/25392770/query-many-to-many-in-sqlalchemy/

posted on 2015-10-20 12:42 北京涛子 阅读( ...) 评论( ...) 编辑 收藏

转载于:https://www.cnblogs.com/liujitao79/p/4894456.html

<think>好的,用户想了解如何使用Flask-SQLAlchemy进行多查询和复杂SQL操作。我需要根据提供的引用内容来组织回答,同时遵循系统级指令的格式要求。首先,我需要回忆Flask-SQLAlchemy的基本用法,然后结合多查询的方法,比如使用join或者定义关系。此外,复杂SQL操作可能涉及原生SQL语句的使用,或者高级查询方法如filter、group_by等。 引用[1]提到SQLAlchemy是ORM工具,Flask-SQLAlchemy简化了其与Flask的集成。所以多查询可以通过ORM的关系功能来实现。引用[4]中有一个例子使用DATE函数查询当天的数据,这可能涉及到自定义查询条件。而引用[3]讨论了连接问题,这可能提醒我在编写复杂查询时需要注意数据库连接的管理。 用户需要具体的示例教程,因此我需要分步骤说明,包括模型定义、关系建立、查询方法,以及如何执行原生SQL。同时,需要确保所有数学达式和代码块符合格式要求,比如行内公式用$...$,代码用个反引号包裹。 可能需要先介绍模型之间的关系,比如一对多或多对多,然后展示如何通过join或子查询进行联合查询。对于复杂SQL,可能需要演示如何使用db.session.execute执行原生语句,或者使用SQLAlchemy的text函数。同时,要注意引用相关文献,例如在提到使用join时引用[1]或[2]。 需要检查LaTeX语法是否正确,比如在行内公式中的变量是否正确使用$包裹。此外,生成的相关问题要围绕多查询和复杂操作展开,比如性能优化、连接管理、事务处理等。 最后,确保回答结构清晰,分点说明,并提供代码示例,如多join查询、关联查询、子查询和原生SQL的使用。同时,注意引用标记的位置,例如在提到ORM功能时引用[1],在提到查询当天数据时引用[4]。</think>### 使用Flask-SQLAlchemy进行多查询与复杂SQL操作 #### 一、多关联查询 1. **定义模型关系** 在Flask-SQLAlchemy中,需通过`relationship`和`ForeignKey`定义关系。例如,用户(`User`)和文章(`Article`)的一对多关系: ```python class User(db.Model): id = db.Column(db.Integer, primary_key=True) name = db.Column(db.String(50)) articles = db.relationship('Article', backref='author') class Article(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(100)) user_id = db.Column(db.Integer, db.ForeignKey('user.id')) ``` 通过`backref`可反向访问关联数据[^1]。 2. **使用`join`进行联合查询** 查询用户及其所有文章: ```python result = db.session.query(User, Article).join(Article, User.id == Article.user_id).all() ``` 3. **关联查询(懒加载)** 通过关系属性直接访问关联数据: ```python user = User.query.get(1) articles = user.articles # 获取用户的所有文章 ``` --- #### 二、复杂SQL操作示例 1. **子查询与`group_by`** 统计每个用户的文章数量: ```python from sqlalchemy import func subquery = db.session.query( Article.user_id, func.count(Article.id).label('article_count') ).group_by(Article.user_id).subquery() result = db.session.query(User.name, subquery.c.article_count).\ outerjoin(subquery, User.id == subquery.c.user_id).all() ``` 2. **原生SQL执行** 使用`db.session.execute`执行复杂SQL语句: ```python sql = """ SELECT u.name, COUNT(a.id) FROM user u LEFT JOIN article a ON u.id = a.user_id GROUP BY u.id """ result = db.session.execute(sql) ``` 3. **时间范围过滤(引用[4]的DATE函数)** 查询当天创建的文章: ```python from sqlalchemy import func today = datetime.today().date() articles = Article.query.filter(func.DATE(Article.create_time) == today).all() ``` --- #### 、事务与连接管理 - **手动提交事务** 复杂操作建议显式控制事务: ```python try: db.session.begin() # 执行操作 db.session.commit() except: db.session.rollback() ``` - **解决连接断开问题(引用[3])** 配置连接池参数(如`pool_recycle`)或增加心跳检测。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值