sqlalchemy backref slow - PullRequest
       11

sqlalchemy backref slow

1 голос
/ 09 февраля 2010

Привет, есть следующие таблицы

nfiletable = Table(
    'NFILE', base.metadata,
    Column('fileid', Integer, primary_key=True),
    Column('path', String(300)),
    Column('filename', String(50)),
    Column('filesize', Integer),
    schema='NATIVEFILES')#,autoload=True,autoload_with=engine)

sheetnames_table=Table(
    'SHEETNAMES', base.metadata, schema='NATIVEFILES', 
    autoload=True, autoload_with=engine)


nfile_sheet_table=Table(
    'NFILE_SHEETNAME',base.metadata,
    Column('fileid', Integer, ForeignKey(nfiletable.c.fileid)), 
    Column('sheetid', Integer, ForeignKey(sheetnames_table.c.sheet_id)),
    schema='NATIVEFILES')

и картографы:

nfile_mapper=mapper(Nfile,nfiletable)

mapper(Sheet, sheetnames_table, properties={
    'files': relation(
        Nfile, secondary=nfile_sheet_table,
        primaryjoin=(sheetnames_table.c.sheet_id==nfile_sheet_table.c.sheetid),
        secondaryjoin=(nfile_sheet_table.c.fileid==nfiletable.c.fileid),
        foreign_keys=[nfile_sheet_table.c.sheetid,nfile_sheet_table.c.fileid],
        backref='sheets')
})

когда я делаю следующее

upl = Session.query(Nfile).filter_by(fileid=k).one()
sheetdb=[]
for sheet in sheetstoadd:
     s = sheetcache[sheetname]
     sheetdb.append(s)
upl.sheets = sheetdb
Session.save(upl)
Session.flush()

линия upl.sheets = sheetdb занимает вечность. Кажется, что все файлы для каждого листа в sheetdb загружаются из базы данных. Как я могу предотвратить это?

1 Ответ

1 голос
/ 14 февраля 2010

, если NFile.sheets ссылается на огромную коллекцию, поместите "lazy = 'dynamic'" в обратную ссылку:

mapper(Sheet, sheetnames_table, properties={
    'files': relation(
        Nfile, secondary=nfile_sheet_table,
        backref=backref('sheets', lazy='dynamic'))
})

Весь материал primaryjoin / primaryjoin / foreign_keys также не нужен, так как ваш nfile_sheet_table имеет ForeignKey конструкции.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...