/-------------\
| 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 [email protected]
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
-~----------~----~----~----~------~----~------~--~---