2015-10-25 4 views
4

Поддержка Flask-SQLAlchemy отражения SQLAlchemy, похоже, не работает для меня совершенно правильно. У меня есть вид my_view, который я хочу задумать через autoload.Получение sqlalchemy зрения отражения для работы в flask-sqlalchemy

Но я хочу, чтобы my_view был богатым объектом и имел различные функции, поэтому я хочу my_view подкласса db.Model. Я хочу, чтобы он в значительной степени работал, как и любая другая модель db, которая не является точкой зрения.

Я делаю это так:

class MyView(db.Model): 
    __tablename__ = 'my_view', 
    __table_args__ = (
     db.UniqueConstraint('id', 'start_date'), 
     { 
      'autoload': True, 
      'autoload_with': db.engine 
     } 
    ) 

    ...my column defs... 

    ...extra functionality... 

Но во время приложения время загрузки я получаю сообщение об ошибке:

<snip> 
File "env/lib/python3.4/site-packages/sqlalchemy/dialects/postgresql/base.py", line 2325, in get_columns 
info_cache=kw.get('info_cache')) 
File "<string>", line 2, in get_table_oid 
File "env/lib/python3.4/site-packages/sqlalchemy/engine/reflection.py", line 54, in cache 
ret = fn(self, con, *args, **kw) 
File "env/lib/python3.4/site-packages/sqlalchemy/dialects/postgresql/base.py", line 2223, in get_table_oid 
    raise exc.NoSuchTableError(table_name) 
sqlalchemy.exc.NoSuchTableError: ('my_view',) 

Однако, если я использую db.Table вместо db.Model это работает:

MyView = db.Table(
    'my_view', 
    db.metadata, 
    ...my column defs... 
    autoload=True, 
    autoload_with=db.engine 
) 

Я действительно хочу иметь объект и использовать db.Model, хотя, поэтому я могу реализовать __eq__() и __json__() и быть в состоянии делать такие вещи, как:

my_view_rows = session.query(MyView)\ 
         .order_by(MyView.column_a)\ 
         .all() 

Любой знает, почему версия моего кода db.Model не работает? Что мне нужно сделать, чтобы заставить его работать?

ответ

2

Использование __table__ вместо __tablename__ и __table_args__ работает.

class MyView(db.Model): 
    __table__ = db.Table(
     'my_view', db.metadata, 
     db.Column('other_table_id', db.Integer, db.ForeignKey('other_table.id'), primary_key=True), 
     ...other column defs... 
     autoload=True, 
     autoload_with=db.engine 
    ) 

    other_table = db.relationship('OtherTable') 
Смежные вопросы