mysql - 通过两个表连接查询 Flask-SQLAlchemy - 连接不起作用
问题描述
我正在尝试加入两个表。
这是我的简化表格
class Spots(db.Model):
__tablename__ = "spots"
geobaseid = db.Column((db.Integer), primary_key=True,autoincrement=True)
spot = db.Column(db.String(50))
url_slug = db.Column(db.String(50))
region = db.Column(db.String(50))
country = db.Column(db.String(50))
chop = db.Column(db.Integer)
small_wave = db.Column(db.Integer)
flat = db.Column(db.Integer)
big_wave = db.Column(db.Integer)
west_direction = db.Column(db.Integer)
southwest_direction = db.Column(db.Integer)
amount = db.Column(db.Integer)
url_slug = db.Column(db.String(50))
forcast = db.relationship('Forcast_short')
class Forcast_short(db.Model):
__tablename__ = "forcast_short"
id = db.Column((db.Integer), primary_key=True,autoincrement=True)
date = db.Column(db.Date)
geobaseid = db.Column((db.Integer), ForeignKey('spots.geobaseid'))
spot = db.Column(db.String(50))
region = db.Column(db.String(50))
country = db.Column(db.String(50))
latitude = db.Column(db.Numeric(10,8))
longitude = db.Column(db.Numeric(10,8))
deg = db.Column(db.Numeric(65,1))
mps = db.Column(db.Numeric(65,1))
这是我的查询不起作用
forcast_query = Forcast_short.query.join(Spots, Spots.geobaseid==Forcast_short.geobaseid).filter(Forcast_short.region == region).all()
我究竟做错了什么?
当我运行查询时,我只能从带有和不带有过滤器的 Forcast_short 获得结果。
<tbody>
<tr>{%for row in forcast_query%}
<td><a href="/spots/{{row.url_slug}}"> {{row.spot}} </a></td>
<td>{{row.mps}} </td>
<td>{{row.url_slug}} </td>
</tr>
{%endfor%}
</tbody>
此查询适用于 Mysql 工作台。
select * from
(
SELECT * FROM sc_db2.forcast_short
) a
join
(
select * from sc_db2.spots
) b
on a.geobaseid = b.geobaseid
;
解决方案
这是一个较短的示例,它说明了点和预测之间的一对多关系(我认为这是您想要做的):
from app import db
class Spot(db.Model):
id = db.Column(db.Integer, primary_key=True)
geobaseid = db.Column(db.Integer)
forecasts = db.relationship('Forecast', backref='spot', lazy='dynamic')
class Forecast(db.Model):
id = db.Column(db.Integer, primary_key=True)
region = db.Column(db.String(50))
spot_id = db.Column(db.Integer, db.ForeignKey('spot.id'))
该db
对象在app
包初始化程序中设置,遵循 Miguel Grinberg 的模式:
from flask import Flask
from config import Config
from flask_sqlalchemy import SQLAlchemy
from flask_migrate import Migrate
app = Flask(__name__)
app.config.from_object(Config)
db = SQLAlchemy(app)
migrate = Migrate(app, db)
from app import models
请注意,设置了外键关系后,您不需要显式连接即可从子对象访问父字段 - SQLAlchemy 允许您只使用点表示法:
>>> from app import db
>>> from app.models import Spot, Forecast
>>> for spot in Spot.query.all():
... print(spot.id, spot.geobaseid)
...
1 1
2 2
>>> for forecast in Forecast.query.all():
... print(forecast.id, forecast.region, forecast.spot_id, forecast.spot.geobaseid)
...
1 Scotland 2 2
2 England 2 2
推荐阅读
- haskell - Haskell中的模式匹配和arity
- python-3.x - python selenium查找前一个父母的孩子的文本
- php - Woocommerce - 免费送货优惠券应将特定送货方式成本更改为 0
- amazon-web-services - 如何使用 SDK 获取前缀下最新修改的对象(最后 2-3 个对象)
- android - 在 android NDK 工具链中安装 LibArchive
- x11 - 链接问题,缺少 Xrandr?
- cmake - 如何为 CMAKE ExternalProject_Add_Step 设置 PATH 环境变量?
- python - 有没有办法将数据从 php 发送到 Heroku python 脚本?
- python - Maya 交换对象 X 和 Z 轴
- php - phpstorm配置问题,CS Fixer Code Sniffer Mess Detector