Ошибка с динамическими классами и sqlalchemy - PullRequest
1 голос
/ 25 июня 2011

Я пытаюсь написать систему регистрации, которая использует динамические классы для создания таблиц.Получение созданных классов и созданных таблиц, кажется, работает нормально, но попытка поместить в них записи приводит к сообщению об ошибке, касающемуся сопоставления, ниже приведен пример кода и сообщение об ошибке.

Base = declarative_base()

#my init function
def tableinit(self,keyargs):
    self.__dict__ = dict(keyargs)

#table creation
tableName = "newTable"
columnsDict["__tablename__"] = tableName
columnsDict["__init__"] = tableinit
columnsDict["id"] = Column("id",Integer, autoincrement = True, nullable = False, primary_key=True)
columnsDict["pid"] = Column("pid",Integer, ForeignKey('someparenttable.id'))  #someparenttable is created with a hard coded class
newTable = type(tableName,(Base,),columnsDict)
tableClassDict[tableName]=newTable

#when doing an entry
newClassInst = subEntryClassDict[tableName]
newEntry = newClassInst(dataDict)
entryList.append(newEntry)  # this is called in a for loop with the entries for someparenttable's entries also

self.session.add_all(entryList) # at this point the error occurs

Ошибка:

UnmappedInstanceError: Класс 'newTable' сопоставлен, но в этом экземпляре отсутствует инструментарий.Это происходит, когда экземпляр создается до вызова sqlalchemy.orm.mapper (module.newTable).

Ответы [ 2 ]

2 голосов
/ 27 июня 2011

Это проще, если вы создаете функцию, возвращающую класс, который вы установили нормально. Я пробовал что-то вроде этого, и это работает:

def getNewTable( db, table ):
    class NewTable( Base ):
        __tablename__ = table
        __table_args__ = { 'schema': db }
        id = Column( ...

    return NewTable

newClassInst = getNewTable( 'somedb', 'sometable' )
newRow = newClassInst( data )
1 голос
/ 26 апреля 2016

Эта проблема вызвана отсутствием интерфейсов функций инструментов для orm, как говорится в описании ошибки.И это на самом деле вызвано self.__dict__ = dict(keyargs) Я думаю.Таким образом, это может быть решено путем восстановления init , которые не изменяют введенные функции с помощью ORM.

Превратите это

#my init function
def tableinit(self,keyargs):
    self.__dict__ = dict(keyargs)

в

#my init function
def tableinit(self,**kwargs):
    self.__dict__.update(kwargs)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...