/-------------\ | Album | \_____________/ | | | | | | | | /-------\ | -------->| A/I | v \_______/ /-------\ | | A/C | v \_______/ /-------------\ | | Image | | \_____________/ | | | /-------\ | | I/C | | \_______/ v | /-------------\ | | Comment |<--------- \_____________/
So what I have here is a relationship where both albums and images have comments, and for my own purposes I want both of them to point at the same Comment. A/C, A/I, and I/C are all many-to-many tables. Here is the code: from sqlalchemy import * from sqlalchemy.ext.activemapper import ActiveMapper, column, \ one_to_many, one_to_one, many_to_many from turbogears.database import metadata, session from model import User class Comment(object): def __init__(self, text, userID, timestamp): self.comment = text self.userID = userID self.timestamp = timestamp CommentTable=Table('Comment', metadata, Column('id', Integer, primary_key=True), Column('text', Unicode(512)), Column('userID', Integer, ForeignKey('tg_user.user_id')), Column('timestamp', Integer) ) CommentMapper = mapper(Comment, CommentTable, properties={ 'user': relation(User, primaryjoin= CommentTable.c.userID==User.c.user_id, uselist=False, lazy=False) } ) class ImageType(object): def __init__(self, name): self.name = name ImageTypeTable = Table('ImageType', metadata, Column('id', Integer, primary_key=True), Column('name', Unicode(128)) ) imageTypeMapper = mapper(ImageType, ImageTypeTable) class Image(object): def __init__(self, name, imageTypeID, fileName): self.name = name self.imageTypeID = imageTypeID self.fileName = fileName ImageTable = Table("Image", metadata, Column('id', Integer, primary_key=True), Column('name', Unicode(128)), Column('imageTypeID',Integer, ForeignKey("ImageType.id"), index=True), Column('fileName',Unicode(512), unique=True), ) #relationship between Images and Comments ImageCommentTable = Table("ImageComment", metadata, Column("imageID", Integer, ForeignKey("Image.id"), primary_key=True), Column("commentID", Integer, ForeignKey("Comment.id"), )) class ImageComment(object): pass mapper(ImageComment, ImageCommentTable) imageMapper = mapper(Image, ImageTable, properties={'comments': relation(Comment, secondary=ImageCommentTable, lazy=False)} ) class Album(object): def __init__(self, name, directory, imageOrder, coverImage): self.name = name self.directory = directory self.imageOrder = imageOrder self.coverImage = coverImage AlbumTable = Table('Album', metadata, Column('id', Integer, primary_key=True), Column('name', Unicode(128)), Column('directory', Unicode(512), unique=True), Column('imageOrder', Unicode(512)), Column('coverImage', Integer, ForeignKey('Image.id')), ) #relationship between Images and Albums AlbumImageTable = Table("AlbumImage", metadata, Column("imageID", Integer, ForeignKey("Image.id"), primary_key=True), Column("albumID", Integer, ForeignKey("Album.id"), primary_key=True)) ###relationship between Albums and Comments AlbumCommentTable = Table("AlbumComment", metadata, Column("commentID", Integer, ForeignKey("Comment.id"), primary_key=True), Column("albumID", Integer, ForeignKey("Album.id"), primary_key=True)) class AlbumComment(object):pass mapper(AlbumComment, AlbumCommentTable) #relationship between Albums and Comments albumCommentMapper = mapper(AlbumComment, AlbumCommentTable, properties = { 'comments':relation(Comment, secondary=AlbumCommentTable, lazy=False) } ) albumMapper = mapper(Album, AlbumTable, properties={ 'images' :relation(Image, backref='album'), 'comments':relation(Comment), } ) Here is the error message: Creating tables at mysql://root:[EMAIL PROTECTED]:3306/percious Traceback (most recent call last): File "c:\python24\scripts\tg-admin-script.py", line 7, in ? sys.exit( File "c:\python24\lib\site-packages\TurboGears-1.0b2-py2.4.egg\turbogears\comm and\base.py", line 358, in main command.run() File "c:\python24\lib\site-packages\TurboGears-1.0b2-py2.4.egg\turbogears\comm and\base.py", line 115, in run sacommand(command, sys.argv) File "<string>", line 5, in sacommand File "c:\python24\lib\site-packages\TurboGears-1.0b2-py2.4.egg\turbogears\comm and\base.py", line 69, in sacreate get_model() File "c:\python24\lib\site-packages\TurboGears-1.0b2-py2.4.egg\turbogears\util .py", line 119, in get_model package = __import__(package_name, {}, {}, ["model"]) File "D:\percious.com\percious\percious\model.py", line 97, in ? from ImageModel import * File "D:\percious.com\percious\percious\ImageModel.py", line 110, in ? albumCommentMapper = mapper(AlbumComment, AlbumCommentTable, properties = { File "C:\Python24\lib\site-packages\pil-1.1.5-py2.4-win32.egg\__init__.py", li ne 55, in mapper File "build\bdist.win32\egg\sqlalchemy\orm\mapper.py", line 205, in __init__ File "build\bdist.win32\egg\sqlalchemy\orm\mapper.py", line 528, in _compile_c lass sqlalchemy.exceptions.ArgumentError: Class '<class 'percious.ImageModel.AlbumCom ment'>' already has a primary mapper defined with entity name 'None'. Use non_p rimary=True to create a non primary Mapper, or to create a new primary mapper, r emove this mapper first via sqlalchemy.orm.clear_mapper(mapper), or preferably s qlalchemy.orm.clear_mappers() to clear all mappers. Anyone have any ideas how I can solve this challenge? -chris --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "sqlalchemy" group. To post to this group, send email to sqlalchemy@googlegroups.com To unsubscribe from this group, send email to [EMAIL PROTECTED] For more options, visit this group at http://groups.google.com/group/sqlalchemy?hl=en -~----------~----~----~----~------~----~------~--~---