Платить, если уж смотреть с «житейских» понятий, нужно за то, чтобы не рассказывать каждому пришедшему на сайт человеку, что, мол, у нас тут самоподписанный сертификат, вы уж качните его себе и ругаться перестанет. Т.е. вы покупаете сертификат у доверенного центра, который представлен в хранилище сертификатов каждого браузера.
Так, посмотрел, можно вот так:
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) + ")>"
Ну, можно, например, сделать таким образом:
def __repr__(self):
mapper = inspect(self)
ent = []
for col in mapper.attrs:
ent.append("{0}={1}".format(col.key, getattr(self, col.key)))
return "<{0}(".format(self.__class__.__name__) + ", ".join(ent) + ")>"
И вставлять во все классы. Только надо как-то убирать рекурсию, когда есть взаимные ассоциации между классами...
В таком случае, если код сильно менять не планируете, можно и правда использовать raw, или даже view/хранимки. Я честно никогда не работал с memcache и redis, но, по-моему, сильно от параметризованных запросов они не помогут. Тут правда лучше делать какие-то параметризованные процедуры/представления, если MySQL умеет не тратить время на их повторный разбор.
Что касается DATE_FORMAT, то можно использовать func.date_format (и вообще [вроде бы] любую функцию), подробнее в документации. Он преобразует/подставляет эту функцию к запросу. Ну, например, даже так работает:
db.session.query(User.name, db.func.cast(User.id, db.String), Role.id).join(Role)
То есть он нормально преобразовывает integer id к строке.
В итоге date_format будет наверное так выглядеть: sqlalchemy.func.date_format(UserItem.date, '%d.%m.%Y')
А выдает какие-то ошибки? На сервере так же запускается, как и на локальной машине? Не через tornado+nginx там, или как-то еще? Установлены ли все библиотеки? Версии библиотек, компонент и интерпретатор совпадают?
Гоняю я что-то, не проснулся видать. BaseQuery нормально позволяет себя итерировать, .all() там не нужен. Мой пример работает, нужно получить информацию об ошибках и трейсы.
Archet: add_entity нужен тогда, когда между таблицами нет реляции, т.е. отсутствует foreign key например. Конструкция rows = Weather.query.outerjoin(User, Weather.ray_id==User.id).add_entity(User).order_by(User.name.asc()) вернет BaseQuery, нужно еще сказать ему взять данные, то есть сделать так: rows = Weather.query.outerjoin(User, Weather.ray_id==User.id).add_entity(User).order_by(User.name.asc()).all(). И тогда действительно вернется набор кортежей (Weather, User). Только еще проверять придется, с outerjoin, не является ли row[1] == None, хотя я не помню, как jinja это обрабатывает, может и не надо =)
Насчет Django более чем поддержу, очень монструозный каркас, со своими правилами игры. По-моему, раньше за него часто хватались из-за встроенной админки (может, это лишь мое субъективное впечатление), но лучше уж самому написать админку, чем мучиться потом =) Да, у Flask есть плагин — Flask-Admin =)
Насчет монстра с кучей либ — монструозность такого слабосвязанного, модульного решения, как Flask очень сильно зависит от того, насколько качественно спроектирован проект и продумано взаимодействие. У меня тоже был «первый блин комом», смотреть было страшно. Потом, немного осознавая концепции, я увидел, что такое положение дел — результат моего непонимания =)
Я вижу одно, достаточно крупное отличие, если абстрагироваться от экосистем вокруг языков. Концепция Python — «должен быть один и, желательно, только один способ сделать <что-то>», в основе Ruby немного другая концепция — «язык не для машины, но для программиста», из нее вытекает противоположное утверждение — «есть масса способов сделать <что-то>». В Руби масса синтаксических конструкций, которые позволяют написать код более изящно и выразительно, кого-то это приводит в восторг. Других приводит в восторг предсказуемость кода на Питоне (особенно в купе с общим стандартом PEP8).
Насчет веба здесь тоже, на мой взгляд, не все так просто. Да, у Руби есть Rails, своеобразная икона для фреймворков, есть Sinatra, которая положила начало массовому распространению очень классной концепции. С другой стороны, Питон имеет в экосистеме Flask, который тоже позволяет создавать прекрасные веб-приложения. А еще, у него есть SQLAlchemy, ORM, который я бы поставил если не в один ряд, то сразу на пол-пункта после JPA в Java. У Ruby когда-то тоже был DataMapper, но с ним сейчас, к большому сожалению, все очень непросто: разработчики решили начать с нуля, но пока что продвижения не видать... В итоге, даже для построения сложной модели предметной области в Руби приходится обходиться ActiveRecord, или, скорее, городить свой слой взаимодействия.
Поэтому, Дмитрий совершенно правильно поднял вопрос — «А вам для чего?»