Ответы пользователя по тегу Flask
  • Что выбрать или Django vs Flask?

    @sormon
    инженер-программист =)
    На сегодняшний день ситуация такова, что Django гораздо сильнее востребован на рынке, нежели Flask. Однако, для написания действительно сложных боевых проектов лучше брать Flask, в частности, из-за достаточно слабого ORM в Django, а так же из-за того, что Django очень монолитный фреймворк, что будет вызывать проблемы в сложных случаях, когда нужно больше, чем дает Django, или то, что он предлагает, в какой-то части не подходит для задачи. Здесь мощь Flask заключается в том, что он позволяет использовать разные инструменты для задач, связывая их, как нужно, иногда даже реализовывая компоненты под себя. Но, накладные расходы здесь будут — написание обвязки, необходимость уметь проектировать систему и более глубоко понимать, что происходит (но в больших и сложных проектах это и так необходимо.)
    Ответ написан
    Комментировать
  • Правильно ли написал многие-ко-многим в терминах Flask-SqlAlchemy?

    @sormon
    инженер-программист =)
    Нужно убрать либо у UploadedFile, либо у User определитель отношения, если вы используете backref, поскольку backref как раз определяет имя поля этого класса для связываемой сущности, и он там и так будет доступен.
    По частоте, тут нет особой разницы, все равно, при указании backref, у обеих сущностей будет доступ к связанным с ней записям.
    Ответ написан
    6 комментариев
  • Как прокрутить в цикле структуру полученную от Flask-SQLAlchemy?

    @sormon
    инженер-программист =)
    for i in items:
      print i.UserItem.id

    Запрос возвращает итератор, нет необходимости вызывать .all():
    items = db.session.query(U, I).join(I).filter(U.id == user_id)

    Насчет добавления ключей поясните подробнее, что вы имеете в виду...
    Ответ написан
  • Flask как подключиться к postgresql?

    @sormon
    инженер-программист =)
    from sqlalchemy import create_engine
    engine = create_engine('postgresql://login:password@host/db')
    Ответ написан
    Комментировать
  • Какой дампер использовать для Flask sqlalchemy?

    @sormon
    инженер-программист =)
    Вам нужно у класса, которым вы описывает сущность, определить метод __repr__:
    Пример из документации (docs.sqlalchemy.org/en/rel_0_9/orm/tutorial.html):
    from sqlalchemy import Column, Integer, String
    >>> class User(Base):
    ...     __tablename__ = 'users'
    ...
    ...     id = Column(Integer, primary_key=True)
    ...     name = Column(String)
    ...     fullname = Column(String)
    ...     password = Column(String)
    ...
    ...     def __repr__(self):
    ...        return "<User(name='%s', fullname='%s', password='%s')>" % (
    ...                             self.name, self.fullname, self.password)


    Добавлю сюда из комментариев решение универсального repr для mapper-классов алхимии, чтобы с форматированием:
    from sqlalchemy import inspect
    ...
    def __repr__(self):
            mapper = inspect(self).mapper
            ent = []
            for col in mapper.column_attrs:
                ent.append("{0}={1}".format(col.key, getattr(self, col.key)))
            return "<{0}(".format(self.__class__.__name__) + ", ".join(ent) + ")>"

    Нужно учесть, что в получаемой строке не будет ассоциаций, т.к. иначе мы можем получить бесконечную рекурсию.
    Этим методом можно переопределить метод __repr__ у Base, чтобы не дублировать его для каждого класса.
    Ответ написан
  • Как составить запрос к 3-м таблицам во Flask SQLAlchemy?

    @sormon
    инженер-программист =)
    Вообще, хорошо бы структуру увидеть, т.к. не понятны связи между таблицами (есть ли там fk)
    Ну а так, если предположить, что в запросе идет связка по fk, то как-то так:
    session.query(User).join(UserItem, Lang)
    Дальше выбирать те поля, которые вам нужны.
    Второй вариант:
    session.query(UserItem.id, UserItem.date, UserItem.item_name, Lang.desc_rus, User.email).join(User, Lang)

    Если не указаны fk, то, к примеру, использовать add_entity.
    Здесь очень сложно рассуждать, без знания того, как описаны таблицы в базе, как описаны модели в SQLA (иди там вообще может reflect), какая нагрузка и так далее.
    Ответ написан
    2 комментария
  • Как правильно составить join-запрос в приложении на Flask?

    @sormon
    инженер-программист =)
    {{ row.ray.username }}
    И вместо
    rows = Weather.query.outerjoin(User, Weather.ray_id==User.id).order_by(User.name.asc())

    Можно просто написать
    rows = Weather.query.outerjoin(User).order_by(User.name.asc())


    Полный пример:
    from flask import Flask, render_template
    from flask.ext.sqlalchemy import SQLAlchemy
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///tst.db'
    db = SQLAlchemy(app)
    
    import datetime
    
    class User(db.Model):
        __tablename__ = 'users'
        id = db.Column(db.Integer, primary_key=True)
        name = db.Column(db.String(100))
        username = db.Column(db.String(120), unique=True)
        password = db.Column(db.String(120))
    
        def __init__(self, name, username, password):
            self.name = name
            self.username = username
            self.password = password
    
    class Weather(db.Model):
        __tablename__ = 'weather'
        id = db.Column(db.Integer, primary_key=True)
        ray_id = db.Column(db.Integer, db.ForeignKey('users.id'))
        ray = db.relationship('User', backref=db.backref('weather_current', uselist=False))   
        putdate = db.Column(db.DateTime)
        sost = db.Column(db.String(250))
        temp = db.Column(db.String(150))
    
        def __init__(self, ray_id, putdate, sost, temp):
            self.ray_id = ray_id
            self.putdate = putdate
            self.sost = sost
            self.temp = temp
    db.drop_all()
    db.create_all()
    
    u = User("usertest2", 'testuser2', '123')
    
    db.session.add(u)
    db.session.commit()
    db.session.add(Weather(u.id, datetime.datetime.now(), 'test', '123'))
    db.session.add(Weather(None, datetime.datetime.now(), 'test', '123'))
    db.session.commit()
            
    @app.route('/', methods = ['GET', 'POST'])
    def weather():
        rows = Weather.query.outerjoin(User).order_by(User.name.asc())
        return render_template("weather.html",
            rows = rows)
    if __name__ == "__main__":
        app.run(debug=True)


    Шаблон:
    <table>
    {% for row in rows %}
      <tr>
      <td align=left>{{ row.ray.name }}</td>
      <td>{{ row.putdate }}</td>
      <td>{{ row.sost }}</td>
      <td>{{ row.temp }}</td>
      <td>{{ row.ray.username }}</td>
      </tr>
     {% endfor %}
    </table>
    Ответ написан
    6 комментариев
  • Почему SQLAlchemy ведет себя таким образом?

    @sormon
    инженер-программист =)
    Нужно немножко внимательнее читать документацию к ext.sqlalcmemy

    Вы используете обертку, но при этом engine объявляете где-то в стороне от нее.
    Да и еще URI к базе указываете в стороне от app.
    Надо так:

    from flask import Flask, render_template
    from flask.ext.sqlalchemy import SQLAlchemy as SA
    
    app = Flask(__name__)
    app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql+mysqlconnector://user:pass@localhost:3306/app_db'
    db = SA(app)
    
    from sqlalchemy import create_engine
    
    db.metadata.reflect(db.engine)
    from Classes import *
    
    @app.route('/')
    def get_index():
        Users.query.all()
        return 'Hello World!'
    
    if __name__ == '__main__':
        app.run(debug=True)
        pass


    И тогда все будет нормально работать
    Ответ написан
    4 комментария