On Nov 15, 2012, at 7:33 PM, Rob Crowell wrote:

> Sorry, that got cut off at the end.
> 
> class IssueTag(Base):
>     __tablename__ = 'issue_user_tag'
> 
> sqlalchemy.exc.InvalidRequestError: Table 'issue_user_tag' is already defined 
> for this MetaData instance.  Specify 'extend_existing=True' to redefine 
> options and columns on an existing Table object.
> 
> On Thursday, November 15, 2012 7:32:29 PM UTC-5, Rob Crowell wrote:
> I'm working with a denormalized cache schema, and I've run into a situation 
> where it would be helpful to be able to create multiple classes that extend 
> Base but refer to the same __tablename__.  Is this possible to do?  I am 
> getting this Exception:
>     sqlalchemy.exc.InvalidRequestError: Table '[tablename]' is already 
> defined for this MetaData instance.  Specify 'extend_existing=True' to 
> redefine options and columns on an existing Table object.
> 
> For a little more insight, we have some attributes that always have exactly 
> one value (user who created the issue), and other attributes that can have 1 
> or more values (user-defined tags for the issue).  If we were being 
> exhaustive, we would create two "cached" tables for our issues since 
> sometimes we want to display recent issues sometimes by user and sometimes by 
> tag:
>     * issue_user
>     * issue_tag
> 
> However, we can get away with writing just one table and querying it with an 
> appropriate group_by("user_id") to achieve the same end as having 2 tables.  
> Since my application should behave as if there were 2 separate cache tables 
> (and I'd like to keep open the option of adding two separate cache tables in 
> the future), I would like to have 2 different Base classes representing the 
> two ways in which we would query the table.  The obvious way of doing this 
> doesn't work:
> 
> class IssueUser(Base):
>     __tablename__ = 'issue_user_tag'
> 
> class IssueTag(Base):
> 
> 
> -- 

two^H^H^H three ways:

1. map to a Table:

mytable = Table("mytable", Base.metadata, Column(...))

class A(Base):
    __table__ = mytable

class B(Base):
    __table__ = mytable


1a: variant of 1, map A as you did but use __table__ on B

class A(Base):
    __tablename__ = 'mytable'

    x = Column(...)

class B(Base):
    __table__ = A.__table__

2. use single table inheritance with no discriminator

class MyTable(Base):
    __tablename__ = 'mytable'

class A(MyTable):
   # ....

class B(MyTable):
   # ...

I don't have an understanding of your querying situation yet, discriminating on 
group_by() seems a little strange as group_by() is only intended to be used to 
group for aggregates, but #1, #1a or #2 should fit the bill.




> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To view this discussion on the web visit 
> https://groups.google.com/d/msg/sqlalchemy/-/pPc-8bqYaSUJ.
> To post to this group, send email to sqlalchemy@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.

-- 
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 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to