Thread: [SQLObject] Updating with Join fields
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: Brian B. <br...@ab...> - 2005-08-09 18:16:17
|
Hello! I'm new to SQLObject, but I think it's one of the best things to come along for Python! The problem I'm having is as follows: Given two class definitions: class TimeRecord(DBBase): date = DateTimeCol() description = StringCol() hours = DecimalCol(size=5, precision=2) project = ForeignKey('Project') person = ForeignKey('Person') @classmethod def selectRecsForWeek(klass, aDate, aPerson): print aPerson return klass.select( AND(klass.q.date >= str(aDate), klass.q.date <= str(aDate+7), klass.q.personID == aPerson.id)) @classmethod def deleteRecsForWeek(klass, aDate, aPerson): print aPerson.id return klass.delete( AND(klass.q.date >= str(aDate), klass.q.date <= str(aDate+7), klass.q.personID == Person.q.id)) I've tried various things for the last condition in the AND(), and it always comes back with the below traceback. When calling the method TimeRecord.deleteRecsForWeek(), I get this traceback: File "ProjectList.py", line 215, in saveTime TimeRecord.deleteRecsForWeek(thedate, person) File "/Users/brian/Dev/ablelink/timeSheet/proj/timeSheet/domain/ timeRecord.py", line 26, in deleteRecsForWeek klass.q.personID == Person.q.id)) File "/Library/Frameworks/Python.framework/Versions/2.4/lib/ python2.4/site-packages/SQLObject-0.7b1-py2.4.egg/sqlobject/main.py", line 1445, in delete obj = cls.get(id, connection=connection) File "/Library/Frameworks/Python.framework/Versions/2.4/lib/ python2.4/site-packages/SQLObject-0.7b1-py2.4.egg/sqlobject/main.py", line 887, in get id = cls.sqlmeta.idType(id) AttributeError: SQLOp instance has no attribute '__int__' Anyone have any ideas? Thanks! Brian |
From: Oleg B. <ph...@ma...> - 2005-08-09 22:25:50
|
Hello! Why the subject is about Join? On Tue, Aug 09, 2005 at 12:15:14PM -0600, Brian Brown wrote: > klass.q.personID == aPerson.id)) [skip] > AttributeError: SQLOp instance has no attribute '__int__' What is aPerson there? What is in its id? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: Brian B. <br...@ab...> - 2005-08-09 22:38:56
|
On Aug 9, 2005, at 1:38 PM, Oleg Broytmann wrote: > Hello! > > Why the subject is about Join? That was a mistake, it should have been about ForeignKey() > > On Tue, Aug 09, 2005 at 12:15:14PM -0600, Brian Brown wrote: > >> klass.q.personID == aPerson.id)) >> > [skip] > >> AttributeError: SQLOp instance has no attribute '__int__' >> > > What is aPerson there? What is in its id? > The definition of Person is: class Person(DBBase): firstName = StringCol() lastName = StringCol() middleName = StringCol() email = StringCol() login = StringCol() password = StringCol() timeRecords = MultipleJoin('TimeRecord') I've tried using both the person object and the id of the person record to compare. In the example I see .personID attribute; I assume that is auto created to refer to an Id of a person table, because I didn't create that, but it's there. What I want to do is select the TimeRecords between two dates and belonging to a Person. thanks! Brian > Oleg. > -- > Oleg Broytmann http://phd.pp.ru/ > ph...@ph... > Programmers don't die, they just GOSUB without RETURN. > > > ------------------------------------------------------- > SF.Net email is Sponsored by the Better Software Conference & EXPO > September 19-22, 2005 * San Francisco, CA * Development Lifecycle > Practices > Agile & Plan-Driven Development * Managing Projects & Teams * > Testing & QA > Security * Process Improvement & Measurement * http://www.sqe.com/ > bsce5sf > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss > |
From: Oleg B. <ph...@ph...> - 2005-08-10 10:42:23
|
Compare klass.q.personID == aPerson.id)) with klass.q.personID == Person.q.id)) The bug is obvious, I think. No? Oleg. -- Oleg Broytmann http://phd.pp.ru/ ph...@ph... Programmers don't die, they just GOSUB without RETURN. |
From: michelts <mic...@gm...> - 2005-08-10 12:04:20
|
Just for note, I had problems with similar joins a time ago, suppose: klass.select(AND( klass.q.date >=3D str(aDate), klass.q.date <=3D str(aDate+7), klass.q.personID =3D=3D aPerson.id, )) The select above doesn't gives what I expecting for... I need one more clause in my where list: klass.select(AND( klass.q.date >=3D str(aDate), klass.q.date <=3D str(aDate+7), klass.q.personID =3D=3D Person.q.id, Person.q.id =3D=3D aPerson.id, )) This way the join works correctly. This problem happens with mysql, with postgresql the first code works well... regards, On 8/10/05, Oleg Broytmann <ph...@ph...> wrote: > Compare >=20 > klass.q.personID =3D=3D aPerson.id)) >=20 > with >=20 > klass.q.personID =3D=3D Person.q.id)) >=20 > The bug is obvious, I think. No? >=20 > Oleg. > -- > Oleg Broytmann http://phd.pp.ru/ ph...@ph... > Programmers don't die, they just GOSUB without RETURN. >=20 >=20 > ------------------------------------------------------- > SF.Net email is Sponsored by the Better Software Conference & EXPO > September 19-22, 2005 * San Francisco, CA * Development Lifecycle Practic= es > Agile & Plan-Driven Development * Managing Projects & Teams * Testing & Q= A > Security * Process Improvement & Measurement * http://www.sqe.com/bsce5sf > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss >=20 --=20 Michel Thadeu Sabchuk Curitiba - Brasil |
From: Brian B. <br...@ab...> - 2005-08-10 17:01:10
|
Thanks to Oleg and Michel for responding!.... my comments are inline below, but the short answer is the problem still exists. On Aug 10, 2005, at 6:04 AM, michelts wrote: > > > The select above doesn't gives what I expecting for... I need one more > clause in my where list: > > klass.select(AND( > klass.q.date >= str(aDate), > klass.q.date <= str(aDate+7), > klass.q.personID == Person.q.id, > Person.q.id == aPerson.id, > )) > This makes sense, and so I did this. (I'm currently using SQLite 3) > On 8/10/05, Oleg Broytmann <ph...@ph...> wrote: > >> Compare >> >> klass.q.personID == aPerson.id)) >> >> with >> >> klass.q.personID == Person.q.id)) >> >> The bug is obvious, I think. No? And I had tried that both ways. Now my method looks like this: @classmethod def deleteRecsForWeek(klass, aDate, aPerson): print aPerson.id return klass.delete( AND(klass.q.date >= str(aDate), klass.q.date <= str(aDate+7), klass.q.personID == Person.q.id, Person.q.id == aPerson.id)) But the traceback is the same: flattener for x in input: File "ProjectList.py", line 219, in saveTime TimeRecord.deleteRecsForWeek(thedate, person) File "/Users/brian/Dev/ablelink/timeSheet/proj/timeSheet/domain/ timeRecord.py", line 29, in deleteRecsForWeek Person.q.id == aPerson.id)) File "/Library/Frameworks/Python.framework/Versions/2.4/lib/ python2.4/site-packages/SQLObject-0.7b1-py2.4.egg/sqlobject/main.py", line 1445, in delete obj = cls.get(id, connection=connection) File "/Library/Frameworks/Python.framework/Versions/2.4/lib/ python2.4/site-packages/SQLObject-0.7b1-py2.4.egg/sqlobject/main.py", line 887, in get id = cls.sqlmeta.idType(id) AttributeError: SQLOp instance has no attribute '__int__' /----------- Brian |
From: michelts <mic...@gm...> - 2005-08-10 17:17:55
|
Hi,=20 > And I had tried that both ways. Now my method looks like this: >=20 > @classmethod > def deleteRecsForWeek(klass, aDate, aPerson): > print aPerson.id > return klass.delete( > AND(klass.q.date >=3D str(aDate), > klass.q.date <=3D str(aDate+7), > klass.q.personID =3D=3D Person.q.id, > Person.q.id =3D=3D aPerson.id)) A person is a instance of the Person table? If you use a integer (a valid id for the Person table), did it work? Can you try to do a select with the same syntax? regards, --=20 Michel Thadeu Sabchuk Curitiba - Brasil |
From: Brian B. <br...@ab...> - 2005-08-10 18:58:11
|
On Aug 10, 2005, at 11:17 AM, michelts wrote: > > A person is a instance of the Person table? If you use a integer (a > valid id for the Person table), did it work? Can you try to do a > select with the same syntax? Yes, a person is an instance of the Person table, which posted the definition of in this thread. I have another method: @classmethod def selectRecsForWeek(klass, aDate, aPerson): print aPerson return klass.select( AND(klass.q.date >= str(aDate), klass.q.date <= str(aDate+7), klass.q.personID == Person.q.id, Person.q.id == aPerson.id)) and it works without fail. Same and clause, so I don't get it, unless it's something in the delete() method. > > regards, > -- > Michel Thadeu Sabchuk > Curitiba - Brasil > |
From: Brian B. <br...@ab...> - 2005-08-19 05:38:24
|
Hello all, Ok, the deal seems to be, (from looking at the source), that the delete() method is only designed to delete one record, and NOT to be used like a select() is. My solution wound up being: @classmethod def deleteRecsForWeek(klass, aDate, aPerson): from sqlobject.sqlbuilder import Delete delete = Delete("time_record", where= AND(klass.q.workDate >= str(aDate), klass.q.workDate <= str(aDate+6), klass.q.personID == aPerson.id)) s = klass._connection.sqlrepr(delete) return klass._connection.query(s) And it works flawlessly. However, I think that delete should work like select, so is anyone else interested in this? If so, I'll take a shot at adding it! Any thoughts? Brian On Aug 10, 2005, at 12:57 PM, Brian Brown wrote: > > On Aug 10, 2005, at 11:17 AM, michelts wrote: > > > >> >> A person is a instance of the Person table? If you use a integer (a >> valid id for the Person table), did it work? Can you try to do a >> select with the same syntax? >> >> > > Yes, a person is an instance of the Person table, which posted the > definition of in this thread. > > I have another method: > > @classmethod > def selectRecsForWeek(klass, aDate, aPerson): > print aPerson > return klass.select( > AND(klass.q.date >= str(aDate), > klass.q.date <= str(aDate+7), > klass.q.personID == Person.q.id, > Person.q.id == aPerson.id)) > > > and it works without fail. Same and clause, so I don't get it, > unless it's something in the delete() method. > > > > >> >> regards, >> -- >> Michel Thadeu Sabchuk >> Curitiba - Brasil >> >> >> > > > > ------------------------------------------------------- > SF.Net email is Sponsored by the Better Software Conference & EXPO > September 19-22, 2005 * San Francisco, CA * Development Lifecycle > Practices > Agile & Plan-Driven Development * Managing Projects & Teams * > Testing & QA > Security * Process Improvement & Measurement * http://www.sqe.com/ > bsce5sf > _______________________________________________ > sqlobject-discuss mailing list > sql...@li... > https://lists.sourceforge.net/lists/listinfo/sqlobject-discuss > > |
From: michelts <mic...@gm...> - 2005-08-19 12:46:16
|
Hi Brian > Ok, the deal seems to be, (from looking at the source), that the > delete() method is only designed to delete one record, and NOT to be > used like a select() is. > > However, I think that delete should work like select, so is anyone > else interested in this? If so, I'll take a shot at adding it! I think delete working as select would be a good add to the source, generally I do a destroySelf, but there was times when I ned a delete method and I used a for loop and a destroySelf :) regards, --=20 Michel Thadeu Sabchuk Curitiba - Brasil |