Hello again,

I have recently noticed that a particular assignment seems to be
taking a "relatively" long time.
Not being a database expert I am confused as to whether the last
assignment 'person.tags = tags' should be so slow when referencing
existing tags that are used by other entities - it seems to try and
get a list of all employees that use the given tag and then spends the
time doing something with the resulting set, but why?

Test case below.

If the slow assignment is expected do you have any advice on how to
speed up such a statement?


Thank you in advance,


Martin

----------------------------------------------------------------------------------

import os, datetime, time
from sqlalchemy import *
from sqlalchemy.orm import *

file = '/tmp/test.db'
if os.path.isfile(file): os.remove(file)
engine = create_engine('sqlite:///%s' % file, echo=True)
metadata = MetaData()
Session = scoped_session(sessionmaker(autoflush=True,
transactional=False, bind=engine))
mapper = Session.mapper

# Classes
#----------------------------------------------
class Employee(object):
    def __init__(self, name=None):
        self.name = name

    def __repr__(self):
        return '%s:%s' % (self.id, self.name)

class Tag(object):
    def __init__(self, label):
        self.label = label

# Setup tables
#----------------------------------------------
employees = Table('employees', metadata,
                  Column('id', Integer, primary_key=True),
                  Column('name', String, nullable=False,
default='bob'),
                  Column('dob', DateTime, nullable=False,
default=datetime.datetime.now),
                 )

tags = Table('tags', metadata,
                    Column('id', Integer, primary_key=True),
                    Column('label', String, nullable=False),
                )

employeesTags = Table('employeesTags', metadata,
                        Column('employee_id', Integer,
ForeignKey('employees.id')),
                        Column('tag_id', Integer,
ForeignKey('tags.id')),
                  )

# Mappers
#----------------------------------------------
mapper(Employee, employees, properties={
    'tags': relation(Tag, secondary=employeesTags,
backref='employees', lazy=False)
})
mapper(Tag, tags)


# Test
#----------------------------------------------
metadata.create_all(engine)
session = Session()
session.begin()

tags = []
for i in xrange(20):
    tag = Tag(str(datetime.datetime.now()))
    tags.append(tag)

for i in xrange(1000):
    p = Employee('john%d' % i)
    p.tags = tags

session.commit()
session.clear()

session.begin()
tags = session.query(Tag).all()[:2]
person = Employee('bob')

started = time.time()
person.tags = tags
print 'Took:', time.time()-started

session.commit()
session.clear()
Session.remove()



--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalchemy@googlegroups.com
To unsubscribe from this group, send email to [EMAIL PROTECTED]
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en
-~----------~----~----~----~------~----~------~--~---

Reply via email to