Запрос на присоединение в PostgreSQL с использованием Python Flask sqlalchemy orm - PullRequest
0 голосов
/ 17 декабря 2018

У меня есть две таблицы X и Y.

X имеет два столбца ID и имя, Y имеет три столбца ID, город, страна

Мне нужно сделать запрос на соединение и взять городи значения страны, соответствующие ее названию, используя идентификатор.id - это внешний ключ.

Я пытался напрямую в PostgreSQL с этим запросом,

select * from x inner join y on x.name = 'xyz'

Он дает точный результат.Но при попытке выполнить тот же запрос с использованием sqlalchemy orm в приложении Python flask это не так.Я новичок в среде Python и Flask.Я не знаю, как этого добиться.

Я объявил определение таблицы и сериализовал функцию в отдельном файле python внутри моего каталога моделей.

В моем файле main.py я импортирую эту модель и пробовал этот тип запросов, ноэто не работает.

from models import x, y

response = x.query.join(y).filter_by(name=name).all()

Я получаю сообщение об ошибке, подобное этому,

sqlalchemy.exc.InvalidRequestError

InvalidRequestError: Не удалось найти предложение FROMприсоединиться от.Попытался присоединиться к <class 'models.y'>, но получил: Не удается найти связи между внешним ключом между 'x' и 'y'.

1 Ответ

0 голосов
/ 18 декабря 2018

Если вы предпочитаете писать обычные операторы SQL, то почему бы не использовать SQLAlchemy для этого.Не требуется, чтобы вы использовали цепочечные методы, такие как join, filter_by и т. Д. Для запросов к вашей базе данных.

Чтобы ответить на этот вопрос, мне нужно сделать некоторые предположения о том, что в вашем modelsфайл.Я предполагаю, что это что-то вроде этого:

from flask_sqlalchemy import SQLAlchemy
import datetime

db = SQLAlchemy()

class BaseModel(db.Model):
    """Base data model for all objects"""
    # more code here

class x(BaseModel, db.Model):
    # more table setup code here

class y(BaseModel, db.Model):
    # more table setup code here

Если это так, то вот что вы можете сделать, чтобы выполнить простые старые параметризованные операторы SQL: *

from flask import Flask
from models import db
import json

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'your_database_connection_string'
db.init_app(app)

result = db.session.execute("select * from x inner join y on x.name = :name", {"name":"xyz"})

# If no rows were returned in the result, return an empty list
if result.returns_rows == False:
    response = []

# Convert the response to a plain list of dicts
else:
    response = [dict(row.items()) for row in result]

# Output the query result as JSON
print(json.dumps(response))

Я нахожу этометод выполнения SQL-запросов во Flash с помощью SQLAlchemy гораздо проще понять и понять, чем пытаться использовать все различные цепочки методов, которые вы пытались использовать в исходном сообщении.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...