I'm using SQLAlchemy, reflecting from an existing MySQL database. I
want to override two DateTime columns to provide proper "created" and
"updated" timestamps (since MySQL can't handle auto-updating two
TIMESTAMP columns in the same row).
According to the SA docs, this should work; however, when I autoload
my Table objects, I get the error:
<class 'sqlalchemy.exceptions.ArgumentError'>: Table 'tablename' is
already defined for this MetaData instance.
This short example illustrates the issue; the test_users table fails
to load. The error goes away if I either remove the foreign key
constraints in the 'test_pets' table, or remove the Column overrides
from the 'test_users' table.
It seems as if SA is instantiating the users mapper first (because the
pets table refers to it), but not paying attention to the override; it
then tries to instantiate the users mapper to effect the override, but
fails.
Thanks in advance...
##########
from sqlalchemy import Table, Column, MetaData, create_engine, func,
ForeignKey
from sqlalchemy.orm import mapper
from sqlalchemy.types import DateTime, Integer, String
__engine = create_engine('mysql://user:[EMAIL PROTECTED]/test')
metadata = MetaData()
metadata.bind = __engine
# Create the tables for example's sake; in production, they
# already exist.
users = Table('test_users', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(40), nullable=False),
Column('created_at', DateTime, nullable=False),
Column('updated_at', DateTime, nullable=False),
mysql_engine='InnoDB')
pets = Table('test_pets', metadata,
Column('id', Integer, primary_key=True),
Column('name', String(40), nullable=False),
Column('user_id', Integer, ForeignKey('test_users.id'),
nullable=False),
Column('created_at', DateTime, nullable=False),
Column('updated_at', DateTime, nullable=False),
mysql_engine='InnoDB')
metadata.drop_all()
metadata.create_all()
metadata.clear()
pets = Table('test_pets', metadata,
Column('created_at', DateTime, default=func.now()),
Column('updated_at', DateTime, default=func.now(),
onupdate=func.now()),
autoload=True)
users = Table('test_users', metadata,
Column('created_at', DateTime, default=func.now()),
Column('updated_at', DateTime, default=func.now(),
onupdate=func.now()),
autoload=True)
class Pet(object):
pass
class User(object):
pass
mapper(Pet, pets)
mapper(User, users)
##########
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---