【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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Flask 中使用 SQLAlchemy 进行 JOIN 操作,可以通过在查询中使用 `join()` 方法来实现。下面是一个示例代码: ```python from flask import Flask from flask_sqlalchemy import SQLAlchemy app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///example.db' db = SQLAlchemy(app) class User(db.Model): id = db.Column(db.Integer, primary_key=True) username = db.Column(db.String(80), unique=True, nullable=False) email = db.Column(db.String(120), unique=True, nullable=False) class Post(db.Model): id = db.Column(db.Integer, primary_key=True) title = db.Column(db.String(80), nullable=False) content = db.Column(db.Text, nullable=False) user_id = db.Column(db.Integer, db.ForeignKey('user.id'), nullable=False) user = db.relationship('User', backref=db.backref('posts', lazy=True)) @app.route('/') def index(): posts = db.session.query(Post).join(User).filter(User.username == 'john').all() return str(posts) ``` 上面的代码中,我们定义了两个模型类 `User` 和 `Post`,并且在 `Post` 模型中定义了一个外键 `user_id`,它关联到了 `User` 模型的 `id` 字段。我们使用 `db.relationship()` 方法来定义了一个 `user` 属性,这个属性可以让我们通过 `post.user` 来访问到这个 `Post` 对象所属的 `User` 对象。 在视图函数中,我们使用 `db.session.query()` 方法来创建查询对象,然后使用 `join()` 方法来指定要关联的模型,最后使用 `filter()` 方法来添加查询条件。在这个例子中,我们查询所有属于用户名为 "john" 的用户的文章。 注意,在使用 `join()` 方法时,我们需要指定关联的属性名,这个属性名可以通过模型中定义的关系属性 `user` 来获取,即 `Post.user`。如果我们想要指定不同的属性名,可以使用 `join(User, Post.user_id == User.id)` 这样的语法来实现。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值