Hi all,
I've got a module defining a number of abstract declarative classes. They
represent standard generic classes/tables.
I'd like to take one of these abstract classes and subclass more than once,
adding a 'schema' name to '__table_args__' and a '__tablename__'. This to
me is like making a specific 'realization' of the abstract class structure.
I want to keep the columns (with info dictionaries) and constraints in the
abstract class, but make a 'realization' of the abstract class as different
tables with different names and schema.
When I do this, however, I get warnings and errors I don't understand. Here's
an example:
% ------------------------ code
--------------------------------------------------------------------------
from sqlalchemy import Column, Numeric, String, Date, PrimaryKeyConstraint
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
class Students(Base):
__abstract__ = True
__table_args__ = (PrimaryKeyConstraint(u'stid', u'last_name'),)
stid = Column(Numeric(9, 0, False), nullable=False, info={'format':
'9.2f'})
first_name = Column(String(30), info={'format': '30.30s'})
last_name = Column(String(30), info={'format': '30.30s'})
description = Column(String(80), info={'format': '80.80s'})
lddate = Column(Date, info={'format': '%Y-%m-%d %H:%M:%S'})
class MyStudents(Students):
__tablename__ = 'students'
__table_args__ = Students.__table_args__ + ({'__schema__': 'me'},)
class OldStudents(Students):
__tablename__ = 'oldstudents'
__table_args__ = Students.__table_args__ + ({'__schema__': 'me'},)
class OtherStudents(Students):
__tablename__ = 'students'
__table_args__ = Students.__table_args__ + ({'__schema__': 'other'},)
% ------------------------ end code
-----------------------------------------------------------------------
1) The abstract declaration goes fine. So does declaring MyStudents.
2) When I declare OldStudents, I get the following warning. Why do I get
this? I thought I was creating things, not replacing anything.
/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/sqlalchemy/sql/expression.py:2477:
SAWarning: Column 'stid' on table Table('students', MetaData(bind=None),
Column('stid', Numeric(precision=9, scale=0, asdecimal=False),
table=<students>, primary_key=True, nullable=False), Column('first_name',
String(length=30), table=<students>), Column('last_name',
String(length=30), table=<students>, primary_key=True),
Column('description', String(length=80), table=<students>),
Column('lddate', Date(), table=<students>), schema=None) being replaced by
Column('stid', Numeric(precision=9, scale=0, asdecimal=False),
table=<oldstudents>, nullable=False), which has the same key. Consider
use_labels for select() statements.
self[column.key] = column
/Library/Frameworks/EPD64.framework/Versions/7.3/lib/python2.7/site-packages/sqlalchemy/sql/expression.py:2477:
SAWarning: Column 'last_name' on table Table('students',
MetaData(bind=None), Column('stid', Numeric(precision=9, scale=0,
asdecimal=False), table=<students>, primary_key=True, nullable=False),
Column('first_name', String(length=30), table=<students>),
Column('last_name', String(length=30), table=<students>, primary_key=True),
Column('description', String(length=80), table=<students>),
Column('lddate', Date(), table=<students>), schema=None) being replaced by
Column('last_name', String(length=30), table=<oldstudents>), which has the
same key. Consider use_labels for select() statements.
self[column.key] = column
3) When I declare OtherStudents (it was just a warning, after all), I get
the following error. Again, I thought I was creating things, not replacing
anything. Is 'schema' not part of the registry?
InvalidRequestError: Table 'students' is already defined for this MetaData
instance. Specify 'extend_existing=True' to redefine options and columns
on an existing Table object.
I just want to be able to create & query a class called MyStudents that
points to a table called 'students' on the 'me' Oracle account, OldStudents
that points to the 'oldstudents' table on the 'me' account, and
OtherStudents that points to the 'students' table on the 'other' account.
All these tables look the same, and I thought this is what abstract
classes where for.
Am I using the wrong bit of SQLAlchemy machinery? If so, could someone
point me to the right bit? I feel like I'm not quite grokking
abstract/concrete table inheritance.
Thanks for your time,
Jon
--
You received this message because you are subscribed to the Google Groups
"sqlalchemy" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sqlalchemy.
For more options, visit https://groups.google.com/groups/opt_out.