【Flask】Sqlalchemy join

### join:
1. join分为left join(左外连接)和right join(右外连接)以及内连接(等值连接)。
2. 参考的网页:http://www.jb51.net/article/15386.htm
3. 在sqlalchemy中,使用join来完成内连接。在写join的时候,如果不写join的条件,那么默认将使用外键来作为条件连接。
4. query查找出来什么值,不会取决于join后面的东西,而是取决于query方法中传了什么参数。就跟原生sql中的select 后面那一个一样。
比如现在要实现一个功能,要查找所有用户,按照发表文章的数量来进行排序。示例代码如下:

 1 # coding:utf-8
 2 # Author: liangjun.chen
 3
 4 from datetime import datetime
 5 from sqlalchemy import create_engine, Column, Integer, String, DateTime, Text, ForeignKey, func
 6
 7 from sqlalchemy.ext.declarative import declarative_base
 8 from sqlalchemy.orm import sessionmaker, relationship, backref
 9
10 HOSTNAME = ‘127.0.0.1‘
11 PORT = 3306
12 DATABASE = ‘sqlalchemy_first‘
13 USERNAME = ‘root‘
14 PASSWORD = ‘123456‘
15
16 DB_URI = ‘mysql+pymysql://{username}:{password}@{host}:{port}/{dbname}?charset=utf8‘.format(
17         username=USERNAME, password=PASSWORD, host=HOSTNAME, port=PORT, dbname=DATABASE
18 )
19 engine = create_engine(DB_URI)
20 Base = declarative_base(engine)
21 Session = sessionmaker(engine)
22 session = Session()
23
24
25 # article
26 class Article(Base):
27     __tablename__ = ‘article‘
28     id = Column(Integer, primary_key=True, autoincrement=True)
29     title = Column(String(50), nullable=False)
30     create_time = Column(DateTime,nullable=False, default=datetime.now)
31     uid = Column(Integer, ForeignKey("user.id"))
32
33     # relation 正向引用, backref反向引用
34     author = relationship("User", backref=backref(‘articles‘, lazy=‘dynamic‘))
35
36     def __repr__(self):
37         return "Article <title: {}>".format(self.title)
38
39
40 class User(Base):
41     __tablename__ = ‘user‘
42     id = Column(Integer, primary_key=True, autoincrement=True)
43     username = Column(String(50), nullable=False)
44
45
46 # Base.metadata.drop_all()
47 # Base.metadata.create_all()
48 #
49 # user1 = User(username=‘saber‘)
50 # user2 = User(username=‘slamdunk‘)
51 #
52 #
53 # for _ in xrange(1):
54 #     article = Article(title=‘article{}‘.format(_))
55 #     article.author = user1
56 #     session.add(article)
57 # session.commit()
58 #
59 # for _ in xrange(3):
60 #     article = Article(title=‘article{}‘.format(_))
61 #     article.author = user2
62 #     session.add(article)
63 # session.commit()
64
65 # 找到所有用户, 按照发表文章数量进行排序
66
67 result = session.query(User.username, func.count(Article.id)).join(Article, Article.uid==User.id).group_by(User.id).order_by(func.count(Article.id).desc()).all()
68 print result

原文地址:https://www.cnblogs.com/chen0427/p/8799237.html

时间: 2024-10-26 15:52:40

【Flask】Sqlalchemy join的相关文章

【Flask】Sqlalchemy 外键

### 外键:使用SQLAlchemy创建外键非常简单.在从表中增加一个字段,指定这个字段外键的是哪个表的哪个字段就可以了.从表中外键的字段,必须和父表的主键字段类型保持一致.示例代码如下: 1 from sqlalchemy import create_engine, Column, Integer, String, Text, ForeignKey 2 3 from sqlalchemy.ext.declarative import declarative_base 4 from sqlal

【Flask】Sqlalchemy group_by having

### group_by:根据某个字段进行分组.比如想要根据性别进行分组,来统计每个分组分别有多少人 ### having: having是对查找结果进一步过滤.比如只想要看未成年人的数量,那么可以首先对年龄进行分组统计人数,然后再对分组进行having过滤.示例代码如下: 1 # coding:utf-8 2 # Author: liangjun.chen 3 4 from datetime import datetime 5 from sqlalchemy import create_eng

【Flask】 结合wtforms的文件上传表单

表单中的文件上传 基本的表单渲染,表单类设置等等就不多说了,参看另一个文章即可.但是那篇文章里没有提到对于FileField,也就是上传文件的表单字段是如何处理,后端又是如何实现接受上传过来的文件的.因为看到了一篇很好的文章[https://zhuanlan.zhihu.com/p/23731819?refer=flask],所以我决定仔细学习一下.下面将按照那篇文章的脉络,由简至繁地说明表单中文件上传的办法. ■ 利用Flask原生的机制进行文件上传 首先在前端肯定有一个带有文件上传功能的表单

【Flask】 项目结构说明

项目结构 Flask的一大优势就是其极其轻量化.但是也需要注意到,如果我们要用Flask做一个大项目的话,把所有代码写在一个文件里肯定是不合适的.非常难以维护.但是和Django这种框架又不一样,Flask并没有规定项目一定要遵从某种必须遵守的目录结构.最终,人们在长期的实践中得到一些比较好用因此约定俗成的目录结构. 一个典型的flask项目的目录结构是这样的(再次明确,不是强制的,而是约定俗成的一种结构): 这种结构有四个顶级文件夹,主体的程序代码都放在app包中:migrations文件夹中

【Flask】 Jinja2模板语言

Jinja2 Jinja2是Python Web编程中的主流模板语言.因为flask是基于Jinja2和Werkzeug发展而来,在安装flask的时候jinja2自动就被装在上面了. 之前提到了很多Jinja2的使用方法啊,下面将补充或者更加详细地说明Jinja2作为模板语言的使用. [Jinja2官方文档]http://docs.jinkan.org/docs/jinja2/ ■ 基本语义 看过之前模板的例子就知道,Jinja2做构成的模板文件中,文本内容大致可以分成几个种类.比如特殊文本(

【Flask】Request

请求方式 Flask默认是GET请求 如果我们在一个页面中即需要GET请求又需要POST请求那么我们需要重写methods方法: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="&

【Flask】 使用Flask-Moment进行日期时间的管理

Flask-Moment Flask-Moment又是一个flask的扩展模块,用来处理时间日期等信息.用这个模块主要是考虑到两点,第一是为了让不同时区的用户看到的都是各自时区的实际时间,而不是服务器所在地的时间.第二是对于一些时间间隔的处理,如果要手动处理很麻烦,如果有模块就很好了. ■ 简介 pip install flask-moment  来安装这个扩展模块.值得一提的是,单单在后台装好这个拓展模块是不够的,还需要前端的配合,因此前端也要配置好相关的支持库.按书上说的,使用了由JS开发的

【Flask】 WTForm表单编程

WTForm表单编程 在网页中,为了和用户进行信息交互总是不得不出现一些表单.flask设计了WTForm表单库来使flask可以更加简便地管理操作表单数据.WTForm中最重要的几个概念如下: Form类,开发者自定义的表单必须继承自Form类或者其子类.Form类最主要的功能是通过其所包含的Field类提供对表单内数据的快捷访问方式. 各种Field类,即字段.一般而言每个Field类都对应一个input的HTML标签.比如WTForm自带的一些Field类比如BooleanField就对应

【Flask】Respones

Flask中的HTTPResponse from flask import Flask,redirect app = Flask(__name__) @app.route("/index") def index(): return "hello word" # HttpResponse[返回字符串] if __name__ == '__main__': app.run("0.0.0.0",9876) 在Flask 中的HttpResponse 在