Здравствуйте. Я пытаюсь перенести устаревшее приложение на python с помощью sqlalchemy.
Существующая база данных приложения содержит около 300 таблиц, и в каждой таблице есть столбец с именем def, например:
create table accnt (
code varchar(20)
, def varchar(50) --for accnt definition
, ...
)
Поэтому, используя декларативный синтаксис и рефлексию, я легко могу создать свой класс как:
class Accnt(Base):
__table__ = Table('accnt', metadata, autoload = True, autoload_with=engine)
Но когда я пытаюсь добраться до столбца def , я в конечном итоге получаю ошибку.Например:
q = session.query(Accnt)
for row in q:
print q.def
Поскольку def является зарезервированным словом для python: (
Чтобы преодолеть эту проблему, я могу создать свой класс как:
class Accnt(Base):
__table__ = Table('accnt', metadata, autoload = True, autoload_with=engine)
__mapper_args__ = {'column_prefix':'_'}
Но ставить _ перед именем каждого столбца скучно и не очень красиво.
Я бы хотел получить доступ к столбцу def с другим именем / (ключ?).
Есть идеи?
--- Редактировать --- (Редактирование исходного сообщения в соответствии с запросом TokenMacGuy )
Пока я принял TokenMacGuy ответ, который я пробовал раньше:
engine = create_engine('firebird://sysdba:masterkey@127.0.0.1/d:\\prj\\db2\\makki.fdb?charset=WIN1254', echo=False)
metadata = MetaData()
DbSession = sessionmaker(bind=engine)
Base = declarative_base()
class Accnt(Base):
__table__ = Table('accnt', metadata, autoload = True, autoload_with=engine)
_def = Column("def", String(50))
И у меня есть sqlalchemy.exc.ArgumentError: Невозможно добавить дополнительный столбец 'def' при указании ошибки таблицы ..
Основное различие между мной и TokenMacGuy заключается в
mine : _table_ ....
TokenMcGuy : __tablename__ = 'accnt'
__table_args__ = {'autoload': True}
и привязке метаданных ...
Итак, почему моя предыдущая попытка вызвала ошибку?