What I think I'm seeing is that an object can be created even without it's
ForeignKeyConstraint being filled.

To run the test code below:

$ dropdb test18; createdb test18; python testcode.py

This builds on
http://groups.google.com/group/sqlalchemy/browse_thread/thread/eb240f3f2555a5e7/
.

I understand that the foreign table can't create the referent.  (and finding
the best idiom for "use one if it exists or create one") is yet be
determined.  What I truly don't understand is how any instances of "Product"
can be created, since there is a FK constraint that is not fulfulled.

1.  Is the foreign key constraint fulfilled?
2.  Is there a good "create the referent if it doesn't exist, else use it"
idiom?
3.  Is the polymorphic table business complicating it?  It seems liek the
compound primary key for A1String is.

----------------
from sqlalchemy.ext.declarative import
declarative_base
from sqlalchemy import CheckConstraint, ForeignKey, MetaData,
PrimaryKeyConstraint
from sqlalchemy import ForeignKeyConstraint
from sqlalchemy import Table, Column, Integer, Boolean,Unicode,String
from sqlalchemy.orm import relation, backref
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker
from sqlalchemy.schema import DDL

import sys
ECHO = bool((sys.argv + [False])[1])

## utilties for connecting the db, printing it, etc.
def print_schema(T="postgres", Base=None):
    ''' print print_schema will print the schema in use '''
    from StringIO import StringIO
    buf = StringIO()
    engine = create_engine('%s://' % T, strategy='mock', executor=lambda s,
p='': buf.write(str(s) + p))
    Base.metadata.create_all(engine)
    return buf.getvalue()

def db_setup(connstring='sqlite:///:memory:', echo=False, Base=None):
    engine = create_engine(connstring, echo=echo)
    Session = sessionmaker(bind=engine, autoflush=False, autocommit=False)
    session = Session()
    Base.metadata.bind = engine
    Base.metadata.create_all()
    return session, engine

def _class_repr(self):
    ''' print our SA class instances in a nicer way '''
    # ugly, use sparingly, may have performance hit
    d = [(k,v) for k,v in self.__dict__.iteritems() if k[0] != "_"]
    d = sorted(d, key=lambda x: x[0].lower())
    return "<%s, %s>" % (self.__class__, d)


Base = declarative_base()

class Polystring(Base):
    __tablename__ = 'strings'
    id = Column(Integer, nullable=False, primary_key=True)
    string = Column(String, nullable=False, primary_key=True)
    origin = Column(String, nullable=False, primary_key=True)
    __mapper_args__ = {'polymorphic_on': origin}

# subtype of string
class A1String(Polystring):
    __mapper_args__ = {'polymorphic_identity': 'a1'}
    products = relation('Product', order_by="Product.id")

class Product(Base):
    __tablename__ = 'product'
    __table_args__ = (
         ForeignKeyConstraint(['regstring_id', 'regstring',
'regstring_type'], [A1String.id, A1String.string
, A1String.origin], on),
        {}
    )
    id = Column(Integer,primary_key=True)
    regstring_id = Column(Integer)
    regstring = Column(String)
    regstring_type = Column(String,default="asn")



## test code
session,eng = db_setup("postgres:///test18", Base=Base, echo=ECHO)
add = session.add
q = session.query
c = session.commit
r = _class_repr


A = Product(id=192832, regstring="some part id")
print r(A)
add(A)
c()  # commit
print map(r,q(Product).all())
print "somehow this managed to get in, without making a polystring, which it
should be referencing."
assert len(q(Polystring).all()) > 0, "So, where is the polystring?"
----------

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