.... forgot the attachment, sorry.

Matt Doran wrote:
Hi there,

I'm very new to SQLObject, but I really like it's simplicity.  However I've encountered an issue that I'm struggling to resolve.

I'm using the latest stable build - sqlobject-0.7.1dev_r1684-py2.4, and also pysqlite 2.2.0.

However I've found the performance is very slow.   I can do about 10 inserts a second.  This is similar performance to what I can achieve with pysqlite directly if I commit after every insert.  However, if I commit after after a batch insert I can insert 1000 rows per second with pysqlite directly.

It appears that SQLObject is performing a commit after every operation (i.e. auto-commit), however I have not found a way to disable this behaviour.  I've tried "connection.autoCommit = False" and tried explicitly using transactions, but neither seemed to work.  

I've attached a script showing what I've been trying.   Here's a summary:
connection = connectionForURI(connection_string)
connection.autoCommit = False
sqlhub.processConnection = connection

trans = connection.transaction()

# ... do inserts...

trans.commit()


Any advice would be greatly appreciated!

Cheers,
Matt
from sqlobject import *
import os
import datetime

db_filename = os.path.abspath('sqlite.db')
if os.path.exists(db_filename):
    os.unlink(db_filename)

if db_filename[1] == ':':
    # Fix path for windows
    db_filename = db_filename[0] + "|" + db_filename[2:]
connection_string = 'sqlite:/' + db_filename
connection = connectionForURI(connection_string)
connection.autoCommit = False
sqlhub.processConnection = connection

class Test(SQLObject):
    number = IntCol()
    desc = StringCol()

Test.createTable()

NUM_INSERTS = 100

if True:
    trans = connection.transaction()
    #connection.debug = True
    start = datetime.datetime.now()
    for i in range(1, NUM_INSERTS):
        #print i
        t = Test(number=i, desc="desc" + str(i))
    trans.commit()
    stop = datetime.datetime.now()
    print "sqlobject: Inserting %d rows took: %s  Per Insert: %s" % 
(NUM_INSERTS, str(stop - start), str((stop - start) / NUM_INSERTS))
    connection.close()

####################

if True:
    from pysqlite2 import dbapi2 as sqlite

    con = sqlite.connect("sqlite.db")
    cur = con.cursor()
    start = datetime.datetime.now()
    for i in range(NUM_INSERTS + 1, NUM_INSERTS * 2):
        #print i
        cur.execute("insert into test (number, desc) values (?, ?);", (i, 
"desc" + str(i)))
    con.commit()
    stop = datetime.datetime.now()
    print "pysqlite: Inserting %d rows took: %s  Per Insert: %s" % 
(NUM_INSERTS, str(stop - start), str((stop - start) / NUM_INSERTS))

    con.close()

Reply via email to