/-------------\
| 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
-~----------~----~----~----~------~----~------~--~---

Reply via email to