Hello,
I get the following error:
_______________________________________
Traceback (most recent call last):
File "D:\Documents\Code\Eclipse\workspace\SQLAtest\data.py", line
29, in <module>
I1 = reg["integer"](integer = 5321)
File "<string>", line 4, in __init__
File "C:\python27\lib\site-packages\sqlalchemy\orm\state.py", line
100, in initialize_instance
fn(self, instance, args, kwargs)
File "C:\python27\lib\site-packages\sqlalchemy\orm\mapper.py", line
2413, in _event_on_init
instrumenting_mapper.compile()
File "C:\python27\lib\site-packages\sqlalchemy\orm\mapper.py", line
807, in compile
mapper._post_configure_properties()
File "C:\python27\lib\site-packages\sqlalchemy\orm\mapper.py", line
837, in _post_configure_properties
prop.init()
File "C:\python27\lib\site-packages\sqlalchemy\orm\interfaces.py",
line 475, in init
self.do_init()
File "C:\python27\lib\site-packages\sqlalchemy\orm\properties.py",
line 900, in do_init
self._determine_synchronize_pairs()
File "C:\python27\lib\site-packages\sqlalchemy\orm\properties.py",
line 1157, in _determine_synchronize_pairs
eq_pairs = self._sync_pairs_from_join(self.primaryjoin, True)
File "C:\python27\lib\site-packages\sqlalchemy\orm\properties.py",
line 1141, in _sync_pairs_from_join
self
sqlalchemy.exc.ArgumentError: Could not determine relationship
direction for primaryjoin condition 'False AND False', on relationship
F_Address_links.number. Ensure that the referencing Column objects
have a ForeignKey present, or are otherwise part of a
ForeignKeyConstraint on their parent Table, or specify the
foreign_keys parameter to this relationship.
____________________________________________
Strange thing is that the line "I1 = reg["integer"](integer = 5321)"
is the first object/record I create and it works when I do not create
any other classes. Also the class/table "F_Address_links" in the error
message exists but no objects/records have been created yet. For
example I do not understand how "I1 = reg["integer"](integer = 5321)"
leads to a call to a method that does anything with "F_Address_links"
or related class/table "F_Address".
Please help ... It might be related to the ForeignKey in the code I
showed earlier in this thread, but I don't see how.
On Apr 2, 11:56 am, farcat <[email protected]> wrote:
> He Michael,
>
> You saved me again .. Thanks!
>
> On Apr 2, 2:09 am, Michael Bayer <[email protected]> wrote:
>
>
>
>
>
>
>
> > On Apr 1, 2011, at 2:52 PM, farcat wrote:
>
> > > Hi Michael,
>
> > > Still stuck, I don't mixin foreign keys or relationships. When is a
> > > Column attached to a table in declarative?
>
> > so you have a few things like:
>
> > > class AtomBase(BaseBase):
> > > id = Column(Integer, primary_key=True)
>
> > where AtomBase does not appear to be a declarative class. Its hard to
> > follow but it appears AtomBase is taking the path that mixins take in
> > declarative (indeed: "__new__(mcls, name, (AtomBase, Base)"). This means
> > "id" will be copied for each actual declarative class generated from
> > AtomBase.
>
> > Later you have:
>
> > > ForeignKey(parent.id),
>
> > This is referencing an "id" column probably too early. In all likelihood
> > It isn't being linked to a table, a copy of it is. Use
> > ForeignKey("parent_table_name.id") instead so that the column is evaluated
> > as late as possible.
>
> > > My code is:
>
> > > import datetime
> > > from datatypes import *
> > > from accessors import member_accessor, reference_accessor
>
> > > from sqlalchemy import *
> > > from sqlalchemy.orm import relationship
> > > from sqlalchemy.orm.session import sessionmaker
> > > from sqlalchemy.ext.declarative import declared_attr, DeclarativeMeta
> > > from sqlalchemy.types import Text, BigInteger, Float, Boolean, Date,
> > > Time
> > > #--------------------------------------------------------------------------
> > > -
> > > engine = create_engine('sqlite:///:memory:', echo=False)
> > > Session = sessionmaker(bind=engine)
> > > register = dict()
>
> > > #--------------------------------------------------------------------------
> > > -
> > > class BaseBase(object):
> > > session = Session()
> > > @declared_attr
> > > def __tablename__(cls): return cls.__name__
> > > def __init__(self, **kwargs):
> > > Base.__init__(self, **kwargs)
> > > self.session.add(self)
> > > print str(self) + " added to session " + str(self.session)
> > > def __repr__(self):
> > > out = "type: " + type(self).__name__ + "{"
> > > for name, mem in self.__dict__:
> > > out += name + ": " + str(mem) + ", "
> > > out += "}"
> > > return out
>
> > > #--------------------------------------------------------------------
> > > class AtomBase(BaseBase):
> > > id = Column(Integer, primary_key=True)
> > > atomic = True
> > > #--------------------------------------------------------------------
> > > class atommeta(DeclarativeMeta):
> > > def __new__(mcls, name, coltype):
> > > return DeclarativeMeta.__new__(mcls, name, (AtomBase, Base),
> > > {name:Column(coltype, nullable = False)})
> > > def __init__(cls, name, coltype):
> > > register[name] = cls
> > > return DeclarativeMeta.__init__(cls, name, (AtomBase, Base),
> > > {})
> > > #--------------------------------------------------------------------------
> > > -
> > > class BaseLink(BaseBase):
>
> > > member_name = Column(String(64), primary_key = True) #Name of
> > > member of parent class
> > > member_table = Column(String(64), primary_key = True) #Name of
> > > table in which value of member resides
> > > member_id = Column(Integer, primary_key = True) #record
> > > is in member_table, with previous column enables polymorphism
> > > def _getitem(self):
> > > t = register[self.member_table]
> > > return self.session.query(t).filter(self.member_id ==
> > > t.id).one()
> > > def _setitem(self, val):
> > > try: del self.item
> > > except AttributeError: pass
> > > self.member_table = val.__tablename__
> > > self.member_id = val.id
> > > def _delitem(self):
> > > t = register[self.member_table]
> > > self.session.query(t).filter(t.id == self.member_id).delete()
> > > item = property(_getitem, _setitem, _delitem)
> > > #--------------------------------------------------------------------------
> > > -
> > > class BaseTable(BaseBase):
>
> > > id = Column(Integer, primary_key = True)
> > > created_at = Column(DateTime, default=datetime.datetime.now())
> > > atomic = False
> > > #--------------------------------------------------------------------------
> > > -
> > > class linkmeta(DeclarativeMeta):
> > > def __new__(mcls, parent):
> > > return DeclarativeMeta.__new__(mcls, "%s_links" %
> > > parent.__name__, (BaseLink, Base),
> > > {"parent_id": Column(Integer,
> > > ForeignKey(parent.id), primary_key=True)})
> > > def __init__(cls, parent):
> > > return DeclarativeMeta.__init__(cls, "%s_links" %
> > > parent.__name__, (BaseLink, Base), {})
> > > #--------------------------------------------------------------------------
> > > -
> > > class tablemeta(DeclarativeMeta):
>
> > > def __new__(mcls, typedef):
> > > out = DeclarativeMeta.__new__(mcls, str(typedef.name),
> > > (BaseTable,Base), {})
> > > out.links = linkmeta(out) #<== Creates class/table enables
> > > links to other tables
> > > members = typedef.all()
> > > for mem in members:
> > > if not mem.type.name in register:
> > > tablemeta(mem.type)
> > > setattr(out, "_" + mem.name, relationship(out.links,
> > > uselist =
> > > (mem.multiplicity != "one"),
> > > backref =
> > > mem.name,
> > > primaryjoin =
> > > and_(out.links.parent_id == out.id,
>
> > > out.links.member_name == mem.name)))
> > > return out
> > > def __init__(cls, typedef):
> > > register[cls.__name__] = cls
> > > temp = dict()
> > > members = typedef.all()
> > > for mem in members:
> > > if mem.reference:
> > > temp[mem.name] = reference_accessor(mem.name,
> > > register[mem.type_name], mem.multiplicity)
> > > else:
> > > temp[mem.name] = member_accessor(mem.name,
> > > register[mem.type_name], mem.multiplicity)
> > > return DeclarativeMeta.__init__(cls, typedef.name,
> > > (BaseTable,Base), temp)
> > > #--------------------------------------------------------------------------
> > > -
> > > def createClasses(engine, session):
> > > print "creating classes and tables"
> > > atommeta("text", Text)
> > > atommeta("integer", BigInteger)
> > > atommeta("decimal", Float)
> > > atommeta("boolean", Boolean)
> > > atommeta("date", Date)
> > > atommeta("time", Time)
> > > typedefs = session.query(Type).filter(Type.atomic == False).all()
> > > for typedef in typedefs:
> > > tablemeta(typedef)
> > > print
> > > "--------------------------------------------------------------------------
> > > ---------"
> > > for reg in register:
> > > print reg
> > > Base.metadata.create_all(engine) #<== ERROR
> > > print"done"
>
> > > Please help ....
>
> > > The typedefs variables describe classes and members, and are queried
> > > from normal tables
>
> > > On Mar 31, 5:33 pm, Michael Bayer <[email protected]> wrote:
> > >> On Mar 31, 2011, at 11:29 AM, farcat wrote:
>
> > >>> Hi,
>
> > >>> I am getting the following error after creating a number of classes
> > >>> through metaclasses:
>
> > >>> File "C:\python27\lib\site-packages\sqlalchemy\dialects\sqlite
> > >>> \base.py", line 280, in visit_foreign_key_constraint
> > >>> if local_table.schema != remote_table.schema:
> > >>> AttributeError: 'NoneType' object has no attribute 'schema'
>
> > >>> Before I paste in any code (would need quite a lot), can anyone point
> > >>> me in the right direction?
>
> > >> There's a Column not attached to a Table somewhere. Like, if you
> > >> are creating a copy of a column, giving that to a table, but then the
> > >> original is what you put in ForeignKey.
>
> > >>> --
> > >>> 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
> > >>> athttp://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 [email protected].
> > > To unsubscribe from this group, send email to
> > > [email protected].
> > > For more options, visit this group
> > > athttp://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 [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.