2015-01-09 3 views
0

Я использую декларативный стиль, чтобы определить мои таблицы с помощью SQLAlchemy.Как получить ссылку столбца из декларативной таблицы в SqlAlchemy?

Base = declarative_base() 

class MyTable(Base): 
    id = Column('someone_put_a_strange_for_id', Integer) 

Теперь, когда я определяю ForeignKey в классе, мне нужно использовать

MyTable.__table__.c.someone_put_a_strange_for_id 

для обозначения этого идентификатора атрибута столбца. Есть ли способ, которым я могу использовать

MyTable.id.some_magic 

, чтобы получить этот атрибут столбца?

+0

Почему бы просто не использовать ссылку на модель (не колонка): 'ForeignKey (MyTable.id)' ? – van

+0

Я пробовал, он не работает. Поскольку имя атрибута отличается от имени поля таблицы. – davidshen84

+0

Странно, это первый простой вариант, о котором Майк упомянул в ответе, и он всегда работал на меня. Надежда другие варианты, перечисленные в ответе Майка, помогут вам. – van

ответ

1

Здесь есть два простых варианта.

Простейший, просто обратитесь к атрибуту на классе!

Base = declarative_base() 

class MyTable(Base): 
    __tablename__ = 'mt' 
    id = Column('someone_put_a_strange_for_id', Integer, primary_key=True) 
    bar = Column(Integer) 

fk = ForeignKeyConstraint(['bar'], [MyTable.id]) 

Это на самом деле не Column объекта, однако практически во всех ситуациях, SQLAlchemy будет смотреть на этом объекте для специального атрибута под названием __clause_element__(), который будет вытаскивать фактическую Column. В современных версиях SQLAlchemy это должно работать практически повсеместно, публикуйте отчет об ошибках, если там что-то не работает.

Другой поставить .KEY на колонке:

class MyTable(Base): 
    id = Column('someone_put_a_strange_for_id', Integer, key='id') 

Выше, что колонка теперь table.c.id во всех случаях в-Python, «имя» только на SQL боковая сторона. Поэтому, если вы имеете дело с table.c напрямую, вы идете.

Есть еще варианты! Картографа, который находится на вашем классе также имеет свой собственный .c атрибут, вы можете получить на этом пути также:

from sqlalchemy import inspect 

Base = declarative_base() 

class MyTable(Base): 
    __tablename__ = 'mt' 
    id = Column('someone_put_a_strange_for_id', Integer, primary_key=True) 

inspect(MyTable).c.id 
+0

Спасибо, я попробую. – davidshen84

Смежные вопросы