Почему запрос таблицы присоединения всегда не возвращает ни один Flask-SqlAlchemy? - PullRequest
0 голосов
/ 29 января 2019

Я новичок в Python и Flask-SqlAlchemy, я просто не могу понять, почему query.join() всегда просто возвращает none, хотя в моей таблице есть точные данные.

Вотмой стол:

class User(db.Model):
    __tablename__ = "users_info"

    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    name = db.Column(db.Integer, unique=True, nullable=True)
    email = db.Column(db.String)

    user_device = db.relationship('Device', backref='user')


class Device(db.Model):
    __tablename__ = "user_device"  

    device_id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    id = db.Column(db.Integer, db.ForeignKey(User.id))
    private_token = db.Column(db.String, nullable=True)

Моя цель - получить id, name в User таблице и private_token в Device таблице дать User.email равно некоторому значению в одном запросе.

Итак, вот что я попробовал:

User.query.join(Device, User.id == Device.id)\
            .add_columns(User.id, User.name, Device.private_token)\
            .filter_by(User.email == data['email'])

Я использую filter() или filter_by() вВыше запрос. Но в конце он все еще возвращает none.

Так что мой вопрос, как правильно присоединиться к таблице?Какой способ достижения моей цели выше?

РЕДАКТИРОВАТЬ:

Я попытался добавить .add() и .first() в приведенном выше запросе, показанный результат просто[ ] после печати на консоли.

User.query.join(Device, User.id == Device.id)\
                .add_columns(User.id, User.name, Device.private_token)\
                .filter_by(User.email == data['email']).all()

1 Ответ

0 голосов
/ 29 января 2019

Только что проверил следующее и работает нормально

Я создал модели следующим образом и добавил некоторые тестовые данные в таблицы:

class User(db.Model):
__tablename__ = "user"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
name = db.Column(db.Integer, unique=True, nullable=True)
email = db.Column(db.String)
devices = db.relationship('Device', backref='user')

class Device(db.Model):
__tablename__ = "device"
id = db.Column(db.Integer, primary_key=True, autoincrement=True)
uuser_id = db.Column(db.Integer, db.ForeignKey('user.id'))
private_token = db.Column(db.String, nullable=True)

Код колбы следующим образом:

@bp.route('/',  methods=['POST', 'GET'])
def home():

    devices = db.session.query(Device, User).join(User).filter(User.email == "test1@gmail.com").all()

    return render_template('main/home.html',
    devices = devices,
   )

Чтобы получить доступ к различным атрибутам,создайте цикл в вашем шаблоне следующим образом:

{% for d in devices %}
  user id: {{ d.User.id }},
  name: {{ d.User.name }},
  private token: {{ d.Device.private_token }}
{% endfor %}

Создайте объект словаря с идентификатором пользователя, именем пользователя и токеном:

    x = {}
    for d in devices:
        x['user_id'] = d.UUser.id
        x['user_name'] = d.UUser.name
        x['private_token'] = d.Device.private_token
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...