Seite 1 von 1

WSGI/Colubrid + SQLObject - Threading-Problem

Verfasst: Mittwoch 7. Juni 2006, 12:18
von henning
Mir ist anscheinend, was Kombinationen von sql-backends und web-frontends angeht mit Python kein Glück beschieden.
Ich will jetzt möglichst schnell von mod_python + direktem mysql zu wsgi/colubrig + sqlobject konvertieren und allmählich gibtsa auch sowas wie nen tatsächlichen Zeitdruck bei der Sache.

Dummerweise meckert SQLObject aber rum, ich solle eine Verbindung nur innerhalb des selben threads benutzen.
Da ich selbst aber kjein zusätzliches threading implementiert habe, muss das ein grundsätzlicheres Problem sein.
Ich habe extra process_request überschrieben und weise da dem connection-hub jedes mal eine frische Verbindung zu:

Code: Alles auswählen

  def process_request(self):
    dbmfile = join(getcwd(), 'data.dbm')
    sqlhub.threadConnection = connectionForURI('sqlite://' + dbmfile)
    r = super(Application, self).process_request()
    return r
Es spielt auch keine Rolle, ob ich threadConnection oder processConnection verwende, der Fehler ist immer wieder:

Code: Alles auswählen

...    return iter(list(self.lazyIter()))
  File "/home/asmanian/uniDB/sqlobject/sresults.py", line 157, in lazyIter
    return conn.iterSelect(self)
  File "/home/asmanian/uniDB/sqlobject/dbconnection.py", line 361, in iterSelect
    select, keepConnection=False)
  File "/home/asmanian/uniDB/sqlobject/inheritance/iteration.py", line 10, in __init__
    super(InheritableIteration, self).__init__(dbconn, rawconn, select, keepConnection)
  File "/home/asmanian/uniDB/sqlobject/dbconnection.py", line 683, in __init__
    self.cursor = rawconn.cursor()
ProgrammingError: SQLite objects created in a thread can only be used in that same thread.The object was created in thread id 16386 and this is thread id 65538
Das ganze wird genau dann ausgelöst, wenn ich die SQL-Verbindung das erste mal wirklich verwenden will (in diesem Fall will ich nen user aus der datanbank raussuchen).

Weiß jemand, was da vor sich geht und kann es mir erklären oder mir sonst irgdnwie helfen, dieses Problem zu lösen?
Es eilt wirklich ein wenig :-/

Verfasst: Mittwoch 7. Juni 2006, 13:07
von mitsuhiko
Das ist ein häufiges SQLObject problem. Beste lösung: sqlalchemy verwenden. workaround: svn version von sqlobject verwenden

Verfasst: Donnerstag 8. Juni 2006, 03:20
von henning
Thnx blackbird, mit sqlalchemy klappts wunderbar und es scheint auch noch ein wenig flexibler zu sein bei weniger "Magie" (in den wrapper-objekten etc...)

:-D