Thread: [SQL-CVS] [ sqlobject-Patches-1353728 ] define foreign keys in Style
SQLObject is a Python ORM.
Brought to you by:
ianbicking,
phd
From: SourceForge.net <no...@so...> - 2005-11-11 07:20:08
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: None Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Nobody/Anonymous (nobody) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-03 11:23:36
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open >Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) >Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-03 12:18:29
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-18 13:17:26
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-18 16:04:38
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-30 17:57:31
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-30 18:07:37
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-01-30 18:10:49
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-09 16:11:35
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-09 16:42:17
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-14 09:05:08
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-15 15:55:07
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-16 15:16:16
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-16 18:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 18:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 12:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 19:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 09:13:56
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 09:22:12
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-17 12:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 12:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 18:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 18:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 12:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 19:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 12:11:15
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 13:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 10:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 12:38:25
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-17 15:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 15:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 12:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 12:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 18:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 18:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 12:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 19:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 13:01:34
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 13:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 13:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 10:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 13:26:47
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 13:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 13:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 10:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 15:49:12
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:49 Message: Logged In: YES user_id=140558 After fixing my patch (I'm sure it works now!!) I'm reviewing the tests that fail. See the attached file "failed tests 2006-01-17 version 1" for the tests an the detailed explanations. In summary: test_ForeignKey.py: you know about it, it fails in all the databases test_SQLMultipleJoin.py: I don't see why it fails, it fails in sqlite and mysql, not in pgsql * sqlite * my problem is that sqlite-3.1.2 does not support alter tabble ad column, so no problem. * mysql * test_datetime.py ---------------- to_python does not seem to work as expected. test_enum.py ------------ BLOB/TEXT column indexes require length in mysql I hope that this makes clear the current status. If you accept the current patch, maybe we could open another ticket with the current bugs in mysql and sqlite, as these are clearly separate issues. Thanks ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 13:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 13:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 10:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 15:55:24
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open >Resolution: Accepted Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-17 18:55 Message: Logged In: YES user_id=4799 Yes, it works finally! Applied in the revision 1607. Thank you for the job! How much does it change the API? Does it have meaning to be applied to 0.7 branch? I actually applied it and it passed all tests, but I don't want to break API for 0.7.1. Will all old programs work? ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 18:49 Message: Logged In: YES user_id=140558 After fixing my patch (I'm sure it works now!!) I'm reviewing the tests that fail. See the attached file "failed tests 2006-01-17 version 1" for the tests an the detailed explanations. In summary: test_ForeignKey.py: you know about it, it fails in all the databases test_SQLMultipleJoin.py: I don't see why it fails, it fails in sqlite and mysql, not in pgsql * sqlite * my problem is that sqlite-3.1.2 does not support alter tabble ad column, so no problem. * mysql * test_datetime.py ---------------- to_python does not seem to work as expected. test_enum.py ------------ BLOB/TEXT column indexes require length in mysql I hope that this makes clear the current status. If you accept the current patch, maybe we could open another ticket with the current bugs in mysql and sqlite, as these are clearly separate issues. Thanks ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 15:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 15:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 12:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 12:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 18:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 18:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 12:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 19:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 15:59:51
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open >Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:59 Message: Logged In: YES user_id=140558 Ok, another test mistery solved: This is the culprit that test_SQLMultipleJoin.py fails: assert str(hibrid.fightersAsSResult.sum('power')) == '23' In pgsql hibrid.fightersAsSResult.sum('power') returns 23. In sqlite-3.1.2 and mysql-4.1 it returns 23.0. So we should either fix the test or the sum function. Fixing the test could be as easy as casting the float to int: assert str(int(hibrid.fightersAsSResult.sum('power'))) == '23' but I'mn not sure if this would hide a bug. Should sum return float or int? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 16:55 Message: Logged In: YES user_id=4799 Yes, it works finally! Applied in the revision 1607. Thank you for the job! How much does it change the API? Does it have meaning to be applied to 0.7 branch? I actually applied it and it passed all tests, but I don't want to break API for 0.7.1. Will all old programs work? ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:49 Message: Logged In: YES user_id=140558 After fixing my patch (I'm sure it works now!!) I'm reviewing the tests that fail. See the attached file "failed tests 2006-01-17 version 1" for the tests an the detailed explanations. In summary: test_ForeignKey.py: you know about it, it fails in all the databases test_SQLMultipleJoin.py: I don't see why it fails, it fails in sqlite and mysql, not in pgsql * sqlite * my problem is that sqlite-3.1.2 does not support alter tabble ad column, so no problem. * mysql * test_datetime.py ---------------- to_python does not seem to work as expected. test_enum.py ------------ BLOB/TEXT column indexes require length in mysql I hope that this makes clear the current status. If you accept the current patch, maybe we could open another ticket with the current bugs in mysql and sqlite, as these are clearly separate issues. Thanks ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 13:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 13:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 10:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 16:07:00
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open >Resolution: Accepted Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-17 19:06 Message: Logged In: YES user_id=4799 SUM() should return whtaver the DB returns. I think summing an INT column returns an int, summing a FLOAT column returns a float. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 18:59 Message: Logged In: YES user_id=140558 Ok, another test mistery solved: This is the culprit that test_SQLMultipleJoin.py fails: assert str(hibrid.fightersAsSResult.sum('power')) == '23' In pgsql hibrid.fightersAsSResult.sum('power') returns 23. In sqlite-3.1.2 and mysql-4.1 it returns 23.0. So we should either fix the test or the sum function. Fixing the test could be as easy as casting the float to int: assert str(int(hibrid.fightersAsSResult.sum('power'))) == '23' but I'mn not sure if this would hide a bug. Should sum return float or int? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 18:55 Message: Logged In: YES user_id=4799 Yes, it works finally! Applied in the revision 1607. Thank you for the job! How much does it change the API? Does it have meaning to be applied to 0.7 branch? I actually applied it and it passed all tests, but I don't want to break API for 0.7.1. Will all old programs work? ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 18:49 Message: Logged In: YES user_id=140558 After fixing my patch (I'm sure it works now!!) I'm reviewing the tests that fail. See the attached file "failed tests 2006-01-17 version 1" for the tests an the detailed explanations. In summary: test_ForeignKey.py: you know about it, it fails in all the databases test_SQLMultipleJoin.py: I don't see why it fails, it fails in sqlite and mysql, not in pgsql * sqlite * my problem is that sqlite-3.1.2 does not support alter tabble ad column, so no problem. * mysql * test_datetime.py ---------------- to_python does not seem to work as expected. test_enum.py ------------ BLOB/TEXT column indexes require length in mysql I hope that this makes clear the current status. If you accept the current patch, maybe we could open another ticket with the current bugs in mysql and sqlite, as these are clearly separate issues. Thanks ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 15:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 15:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 12:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 12:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 18:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 18:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 12:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 19:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 16:12:41
|
Patches item #1353728, was opened at 2005-11-11 08:20 Message generated for change (Comment added) made by linux4u You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None Status: Open >Resolution: Invalid Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 17:12 Message: Logged In: YES user_id=140558 Answering your concerns about the API... The only change is the one I have explained when using addColumn(fieldID, ForeignKey..). If you put ID, the current default style rules would add it too, so you'd get fieldIDID. We could change the style rules and look at this case, but I think that the current behaviour (as it is now with the patch) is completly orthogonal and always acts the same way, no black magic required. For the rest this is a HUGE addition!! You don't need to worry anymore about namning styles, nothing is written in stone. the ID thing was everywhere in the code Combined with the other patch (select using the object, not the id), you can almost always avoid referring directly to foreign field names. I really feel much more comfortable with these changes applied, seeign fieldID in the code maed me feel that something was not competely right. Avoiding it makes the code look beautiful. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 17:06 Message: Logged In: YES user_id=4799 SUM() should return whtaver the DB returns. I think summing an INT column returns an int, summing a FLOAT column returns a float. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:59 Message: Logged In: YES user_id=140558 Ok, another test mistery solved: This is the culprit that test_SQLMultipleJoin.py fails: assert str(hibrid.fightersAsSResult.sum('power')) == '23' In pgsql hibrid.fightersAsSResult.sum('power') returns 23. In sqlite-3.1.2 and mysql-4.1 it returns 23.0. So we should either fix the test or the sum function. Fixing the test could be as easy as casting the float to int: assert str(int(hibrid.fightersAsSResult.sum('power'))) == '23' but I'mn not sure if this would hide a bug. Should sum return float or int? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 16:55 Message: Logged In: YES user_id=4799 Yes, it works finally! Applied in the revision 1607. Thank you for the job! How much does it change the API? Does it have meaning to be applied to 0.7 branch? I actually applied it and it passed all tests, but I don't want to break API for 0.7.1. Will all old programs work? ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:49 Message: Logged In: YES user_id=140558 After fixing my patch (I'm sure it works now!!) I'm reviewing the tests that fail. See the attached file "failed tests 2006-01-17 version 1" for the tests an the detailed explanations. In summary: test_ForeignKey.py: you know about it, it fails in all the databases test_SQLMultipleJoin.py: I don't see why it fails, it fails in sqlite and mysql, not in pgsql * sqlite * my problem is that sqlite-3.1.2 does not support alter tabble ad column, so no problem. * mysql * test_datetime.py ---------------- to_python does not seem to work as expected. test_enum.py ------------ BLOB/TEXT column indexes require length in mysql I hope that this makes clear the current status. If you accept the current patch, maybe we could open another ticket with the current bugs in mysql and sqlite, as these are clearly separate issues. Thanks ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 14:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 13:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 13:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 10:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 10:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 16:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 16:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 10:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 17:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 17:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 19:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 18:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 17:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 14:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 13:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 12:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |
From: SourceForge.net <no...@so...> - 2006-02-17 16:29:12
|
Patches item #1353728, was opened at 2005-11-11 10:20 Message generated for change (Comment added) made by phd You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: None Group: None >Status: Closed >Resolution: Accepted Priority: 5 Submitted By: Pau Aliagas (linux4u) Assigned to: Oleg Broytmann (phd) Summary: define foreign keys in Style Initial Comment: I don't like to use attrID all along the code to access related tables, I want to be able use the nomeclature I like taking advantage of the nice Style idea. This is especially true when you create RelatedJoins when you use a nomeclature like I do (table.id_table), but it's the same for all the nomeclatures you can imagine. In styles.py it warns: def instanceAttrToIDAttr(self, attr): # @@: Right now, because of how names are created for foreign # keys, you can't really change this style. return attr + "ID" With this patch you can define how you want the foreign keys generated, they won't be mandatorily generated as attrID. Example: class LongStyle(Style): """ This style is derived from Style, that does not do any translation, but constructs the table ids like id_table. """ def instanceAttrToIDAttr(self, attr): return "id_" + attr def tableReference(self, table): # str.rsplit is python 2.4+ only if version_info >= (2, 4): return "id_" + table.rsplit(".", 1)[-1] else: return "id_" + rsplit(table, ".", 1)[-1] class mm_server(SQLObject): class sqlmeta: table = "smsarena.mm_server" style = LongStyle(longID = True) _connection = conn_smsarena server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") tz = StringCol(length = 20, default = 'CET', notNone = True) conutry_code = StringCol(length = 2, varchar = False, default = '', notNone = True) # until now I had to do this # mm_server_aliases = SQLMultipleJoin("mm_server_alias", joinColumn = "mm_serverID", orderBy = "server") # now it's perfect! mm_server_aliases = SQLMultipleJoin("mm_server_alias", orderBy = "server") class mm_server_alias(SQLObject): class sqlmeta: table = "smsarena.mm_server_alias" style = LongStyle(longID = True) _connection = conn_smsarena # until now I had to do this # mm_server = ForeignKey("mm_server", dbName = "id_mm_server") mm_server = ForeignKey("mm_server") server = StringCol(alternateID = True, varchar = True, length = 255, alternateMethodName = "by_server") I hope it's clear :) Pau ---------------------------------------------------------------------- >Comment By: Oleg Broytmann (phd) Date: 2006-02-17 19:29 Message: Logged In: YES user_id=4799 Even that's a big change, too big for 0.7 bugfix. Don't hesitate to post patches or at least bug reports for other issues. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 19:12 Message: Logged In: YES user_id=140558 Answering your concerns about the API... The only change is the one I have explained when using addColumn(fieldID, ForeignKey..). If you put ID, the current default style rules would add it too, so you'd get fieldIDID. We could change the style rules and look at this case, but I think that the current behaviour (as it is now with the patch) is completly orthogonal and always acts the same way, no black magic required. For the rest this is a HUGE addition!! You don't need to worry anymore about namning styles, nothing is written in stone. the ID thing was everywhere in the code Combined with the other patch (select using the object, not the id), you can almost always avoid referring directly to foreign field names. I really feel much more comfortable with these changes applied, seeign fieldID in the code maed me feel that something was not competely right. Avoiding it makes the code look beautiful. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 19:06 Message: Logged In: YES user_id=4799 SUM() should return whtaver the DB returns. I think summing an INT column returns an int, summing a FLOAT column returns a float. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 18:59 Message: Logged In: YES user_id=140558 Ok, another test mistery solved: This is the culprit that test_SQLMultipleJoin.py fails: assert str(hibrid.fightersAsSResult.sum('power')) == '23' In pgsql hibrid.fightersAsSResult.sum('power') returns 23. In sqlite-3.1.2 and mysql-4.1 it returns 23.0. So we should either fix the test or the sum function. Fixing the test could be as easy as casting the float to int: assert str(int(hibrid.fightersAsSResult.sum('power'))) == '23' but I'mn not sure if this would hide a bug. Should sum return float or int? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 18:55 Message: Logged In: YES user_id=4799 Yes, it works finally! Applied in the revision 1607. Thank you for the job! How much does it change the API? Does it have meaning to be applied to 0.7 branch? I actually applied it and it passed all tests, but I don't want to break API for 0.7.1. Will all old programs work? ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 18:49 Message: Logged In: YES user_id=140558 After fixing my patch (I'm sure it works now!!) I'm reviewing the tests that fail. See the attached file "failed tests 2006-01-17 version 1" for the tests an the detailed explanations. In summary: test_ForeignKey.py: you know about it, it fails in all the databases test_SQLMultipleJoin.py: I don't see why it fails, it fails in sqlite and mysql, not in pgsql * sqlite * my problem is that sqlite-3.1.2 does not support alter tabble ad column, so no problem. * mysql * test_datetime.py ---------------- to_python does not seem to work as expected. test_enum.py ------------ BLOB/TEXT column indexes require length in mysql I hope that this makes clear the current status. If you accept the current patch, maybe we could open another ticket with the current bugs in mysql and sqlite, as these are clearly separate issues. Thanks ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:26 Message: Logged In: YES user_id=140558 I've fixed the problems with addColumns and delColum, now it passes the tests (not the ones that fail I do not why). I've fixed the tests too: I think we should NOT add the columns with ID at the end as the style add it for you. Otherwise I should modify the sytle functions to conditionally check if they end in ID.... I don't think that it is ok, if we want that, we define anthjer style that removes double ID at the end. This is internal to the style and so should be kept. Hope it's ok now :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 16:01 Message: Logged In: YES user_id=140558 These are my versions (ignore my comment in the other patch ticket, my misake): mysql-4.1.16-1.FC4.1 postgresql-8.0.7-1.FC4.1 python-psycopg-1.1.21-1.fc4 python-sqlite-1.1.6-1 sqlite-3.1.2-3 ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 15:38 Message: Logged In: YES user_id=4799 Except for the problem i test_ForeignKey.py that I know about... others look pretty strange. Let look at the environment. What DB versions? MySQL, PgSQL, SQLite? Drivers versions? MySQLdb, psycopg, PySQLite? MyPostgres is 7.4, psycopg 1.1.21 and 2.0b5. PySQLite 1.1.7 and 2.1.3. A week ago I upgarded to SQLite 3.3.3 and PySQLite 2.1.3; that eliminated some minor problems with patches I have had with SQLIte 2.8.0 and PySQLite 2.1.0. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 15:11 Message: Logged In: YES user_id=140558 Ok, plain SQLObject from SVN now, no patch. There are tests that fail for me in current SQLObject in mysql, postgres and sqlite. I attach them all. This is a fully updated Fedora 4. I've made the tests in mysql and there are some thet do not pass. I enclose the results and a file where I comment why the fail and a possible solution. The tests that fail in postgres and sqlite are the ones I've already reported (mnore or less). Any help? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-17 12:22 Message: Logged In: YES user_id=4799 No, the latest SQLObject passes all tests (how would I commit your other patch if a test fail?) except for minor glitch in test_ForeignKey.py which I'm going to resolve RSN. test_auto.py certainly pass. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-17 12:13 Message: Logged In: YES user_id=140558 I've run the test with the latest SQLObject (no extra patches) and the tests fail too, at least they fail when I run them. As I explained before, there's something wrong when adding columns to sqlite, it fails and all the tests that depend on the added columns fail too. Does it happen to you too? ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-16 18:16 Message: Logged In: YES user_id=4799 These tests fail in both Postgres and SQLite. Two major backends (of 3) for SQLObject. If the problem is in tests you can patch tests, too... test_auto.py: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] > l = [p.phone for p in Person.selectBy(name='tim')[0].phones] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/test_auto.py:59] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ > [failure to get at sourcelines from <TracebackEntry /home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1>] [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/tests/<string>:1] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def performJoin(self, inst): ids = inst._connection._SO_selectJoin( self.otherClass, self.joinColumn, > inst.id) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/joins.py:144] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _SO_selectJoin(self, soClass, column, value): return self.queryAll("SELECT %s FROM %s WHERE %s = %s" % (soClass.sqlmeta.idName, soClass.sqlmeta.table, column, > self.sqlrepr(value))) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:652] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def queryAll(self, s): > return self._runWithConnection(self._queryAll, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:327] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _runWithConnection(self, meth, *args): conn = self.getConnection() try: > val = meth(conn, *args) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:228] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _queryAll(self, conn, s): if self.debug: self.printDebug(conn, s, 'QueryAll') c = conn.cursor() > self._executeRetry(conn, c, s) [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:320] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _executeRetry(self, conn, cursor, query): if self.debug: self.printDebug(conn, query, 'QueryR') E return cursor.execute(query) > OperationalError: no such column: person_id [/home/phd/work/SQLObject/SQLObject-rlike/sqlobject/dbconnection.py:306] - - - - - - - - - - - test_dynamicJoin: recorded stdout - - - - - - - - - - - 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/Query : DELETE FROM person 1/QueryR : DELETE FROM person 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'person' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/Query : DELETE FROM phone 1/QueryR : DELETE FROM phone 1/COMMIT : auto 1/QueryOne: SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/QueryR : SELECT tbl_name FROM sqlite_master WHERE type='table' AND tbl_name = 'phone' 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jane') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 1 1/QueryR : SELECT name_col FROM person WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('tim') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 2 1/QueryR : SELECT name_col FROM person WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('bob') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 3 1/QueryR : SELECT name_col FROM person WHERE id = 3 1/COMMIT : auto 1/QueryIns: INSERT INTO person (name_col) VALUES ('jake') 1/COMMIT : auto 1/QueryOne: SELECT name_col FROM person WHERE id = 4 1/QueryR : SELECT name_col FROM person WHERE id = 4 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-555-5555') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 1 1/QueryR : SELECT phone FROM phone WHERE id = 1 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('555-394-2930') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 2 1/QueryR : SELECT phone FROM phone WHERE id = 2 1/COMMIT : auto 1/QueryIns: INSERT INTO phone (phone) VALUES ('444-382-4854') 1/COMMIT : auto 1/QueryOne: SELECT phone FROM phone WHERE id = 3 1/QueryR : SELECT phone FROM phone WHERE id = 3 1/COMMIT : auto 1/Query : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/QueryR : ALTER TABLE phone ADD COLUMN person_i_d_id INT 1/COMMIT : auto 1/Select : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/QueryR : SELECT phone.id, phone.phone, phone.person_i_d_id FROM phone WHERE 1 = 1 ORDER BY phone 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'bob' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/Select : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/QueryR : SELECT person.id, person.name_col FROM person WHERE name_col = 'tim' ORDER BY name_col LIMIT 1 1/COMMIT : auto 1/QueryAll: SELECT id FROM phone WHERE person_id = 2 1/QueryR : SELECT id FROM phone WHERE person_id = 2 1/COMMIT : auto ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-15 18:54 Message: Logged In: YES user_id=140558 Ok, here I go again. I've fixed a small bug: the name of the field was not porperly set when using Key(foreignKey... instead of ForeignKey. This fixes test_basic. And I think that there is nothing else to fix, I'm probably wrong, but I'll explain it hera. test_auto_old.py... FAIL test_auto.py... FAIL test_foreignKey.py... FAIL These tests fail because sqlite is failing when adding columns. In mysql it does not fail. I do not think it's this patch fault. And finally: test_SQLMultipleJoin.py... FAIL E assert str(hibrid.fightersAsSResult.sum('power')) == '23' > assert '23.0' == '23' + where '23.0' = str(23.0) + where 23.0 = <Race 3 name="'hibrid (human wi...'">.fightersAsSResult.sum('power') Again this is an error in the test. Please let me know if it can go in now :) If you can have a quick look at it better, it takes time to restart ths tests, I'd rather do it before I move on to another thing. Thanks Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-14 12:05 Message: Logged In: YES user_id=140558 Oleg, I've posted to the list because I run the tests and pass. I'm sure I'm doing something wrong but I don't see what. I lost more than 3 hours yesterday just trying to run te tests :( I printed things in dbtest.py and say that TESTDB did not change anything. I chenged manually conftest.py because I ahd a message that yoiu need sqlite2 for memory databases, but still I'm not sure everything works becasue I pass al the tests. Can you help me, I want to close this patch soon and move to other improvements but this is being much more difficult than it should. Thanks a lot Pau ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-02-09 19:42 Message: Logged In: YES user_id=140558 I'm very busy but again will try to find some time to fix it. I'm using it every day without a glitch, even using the clause attributes like in the Complex example (new type of joins *toMany). I'll update it to latest SVN just in case this is the problem, I did it with that day's current. Please do not close it, I really intend to pass the tests, I'm already using it. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-02-09 19:11 Message: Logged In: YES user_id=4799 test_auto.py, for example fails: def test_dynamicJoin(self): col = KeyCol('personID', foreignKey='Person') Phone.sqlmeta.addColumn(col, changeSchema=True) join = MultipleJoin('Phone') Person.sqlmeta.addJoin(join) for phone in Phone.select('all'): if phone.phone.startswith('555'): phone.person = Person.selectBy(name='tim')[0] else: phone.person = Person.selectBy(name='bob')[0] l = [p.phone for p in Person.selectBy(name='tim')[0].phones] l.sort() E assert l == ['555-394-2930', '555-555-5555'] > assert [] == ['555-394-2930', '555-555-5555'] [sqlobject/tests/test_auto.py:61] ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:10 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-30 21:07 Message: Logged In: YES user_id=140558 I'll recheck it, it really passed all the tests applied to the latest svn. I tell you something tomorrow. ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-30 20:57 Message: Logged In: YES user_id=4799 test_auto.py, test_auto_old.py and test_basic.py failed. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 19:04 Message: Logged In: YES user_id=140558 This is the final patch against latest svn, it includes everything in one single patch. It passes the tests. ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-18 16:17 Message: Logged In: YES user_id=140558 Ok, I have taken my time to understand pydist, test, etc, and here I am back with the working solution :) Now the resulting SQLobject passes all the tests. I attach an incremental patch so that you can see more clearly the changes done to fix the previous one. I've needed a new method in the Style class, instanceIDAttrToAttr, that is the complementary to the already known instanceAttrToIDAttr. If you need to transform back and forth field names, you need them both. I haven't tried to port it to the latest svn yet, this is against the same release than the first patch, but it should apply more or less clearly as this are very isolated areas in the code. When I do it I'll post it here. Sorry for the delay, it has not been easy for me to understand more deeply the code and, even less, to know how the tests work :) ---------------------------------------------------------------------- Comment By: Pau Aliagas (linux4u) Date: 2006-01-03 15:18 Message: Logged In: YES user_id=140558 It fails because the test is not right, it still has the ID postfix hardcoded. My fault, I did no send a patch for tests. This is the piece that fails: # Select by usual way s = TestWorkKey.selectBy(composerID=c.id, title='Symphony No. 9') I have not looked at tests until now, but it looks like there should be tests for the different provides styles, in this case, if you accept the patch, at least a test for the LongStyle provided and for the current naming styles. I'll try to cook up something, but it can take a little time. Any guidelines will be appreciated (I've just read the docs ;) ---------------------------------------------------------------------- Comment By: Oleg Broytmann (phd) Date: 2006-01-03 14:23 Message: Logged In: YES user_id=4799 test_selectBy_foreignKey.py fails: def test1(): setupClass([TestComposerKey, TestWorkKey]) c = TestComposerKey(name='Mahler, Gustav') > w1 = TestWorkKey(composer=c, title='Symphony No. 9') [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/tests/test_selectBy_foreignKey.py:19] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def __init__(self, **kw): # The get() classmethod/constructor uses a magic keyword # argument when it wants an empty object, fetched from the # database. So we have nothing more to do in that case: if kw.has_key('_SO_fetch_no_create'): return post_funcs = [] self.sqlmeta.send(events.RowCreateSignal, kw, post_funcs) # Pass the connection object along if we were given one. if kw.has_key('connection'): self._connection = kw['connection'] self.sqlmeta._perConnection = True del kw['connection'] self._SO_writeLock = threading.Lock() if kw.has_key('id'): id = self.sqlmeta.idType(kw['id']) del kw['id'] else: id = None > self._create(id, **kw) [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1210] _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ def _create(self, id, **kw): self.sqlmeta._creating = True self._SO_createValues = {} self._SO_validatorState = SQLObjectState(self) # First we do a little fix-up on the keywords we were # passed: for column in self.sqlmeta.columnList: # Then we check if the column wasn't passed in, and # if not we try to get the default. if not kw.has_key(column.name) and not kw.has_key(column.foreignName): default = column.default # If we don't get it, it's an error: if default is NoDefault: E raise TypeError, "%s() did not get expected keyword argument %s" % (self.__class__.__name__, column.name) > TypeError: TestWorkKey() did not get expected keyword argument composerID [/home/phd/work/SQLObject/SQLObject-patches/sqlobject/main.py:1231] - - - - - - - - - - - - - test1: recorded stdout - - - - - - - - - - - - - - 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_composer_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/QueryR : CREATE TABLE test_composer_key ( id SERIAL PRIMARY KEY, name TEXT ) 1/COMMIT : auto 1/QueryOne: SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/QueryR : SELECT COUNT(relname) FROM pg_class WHERE relname = 'test_work_key' 1/COMMIT : auto 1/Query : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/QueryR : CREATE TABLE test_work_key ( work_id SERIAL PRIMARY KEY, composer_id INT, title TEXT ) 1/COMMIT : auto 1/Query : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/QueryR : ALTER TABLE test_work_key ADD CONSTRAINT composer_id_exists FOREIGN KEY (composer_id) REFERENCES test_composer_key (id) 1/COMMIT : auto 1/QueryIns: INSERT INTO test_composer_key (id, name) VALUES (1, 'Mahler, Gustav') 1/COMMIT : auto 1/QueryOne: SELECT name FROM test_composer_key WHERE id = 1 1/QueryR : SELECT name FROM test_composer_key WHERE id = 1 1/COMMIT : auto ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=540674&aid=1353728&group_id=74338 |