2011-09-28 37 views
0

我正在查看http://www.sqlalchemy.org/trac/browser/examples/generic_associations/discriminator_on_association.py,並嘗試將該示例調整爲通用並可重用的示例。所以我試圖抽象所有的類。但是,創建者對象的功能似乎存在錯誤。嘗試修改sqlalchemy的多態關聯示例時創建者函數出錯

任何人都可以請幫助我如何修復?否則,如果我知道什麼是錯誤的,我想這將是一個很好的候選人,包括在SQLalchemy食譜中。

ERROR: 
Traceback (most recent call last): 
File "sqlalchemyex.py", line 136, in <module> 
    zip="95732") 
File "<string>", line 4, in __init__ 
File "/home/ahmed/dev/pyrenv/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/orm/state.py", line 111, in initialize_instance 
    return manager.events.original_init(*mixed[1:], **kwargs) 
File "/home/ahmed/dev/pyrenv/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/ext/declarative.py", line 1378, in _declarative_constructor 
    setattr(self, k, kwargs[k]) 
File "/home/ahmed/dev/pyrenv/lib/python2.6/site-packages/SQLAlchemy-0.6.6-py2.6.egg/sqlalchemy/ext/associationproxy.py", line 195, in __set__ 
    setattr(obj, self.target_collection, creator(values)) 
File "sqlalchemyex.py", line 28, in <lambda> 
    discriminator=discriminator) 
TypeError: object.__new__() takes no parameters 




from sqlalchemy.schema import Column, ForeignKey 
from sqlalchemy.types import String, Integer 
from sqlalchemy.ext.declarative import declared_attr, declarative_base 
from sqlalchemy.orm import relationship, backref 
from sqlalchemy.ext.associationproxy import association_proxy 
from sqlalchemy.engine import create_engine 
from sqlalchemy.orm.session import sessionmaker 
import os 


class AssociationBase(object): 

    discriminator = Column(String) 
    """Refers to the type of parent.""" 

    @classmethod 
    def creator(cls, discriminator): 
     """Provide a 'creator' function to use with 
     the association proxy.""" 

     return lambda associateds:AssociationBase(
           associateds=associateds, 
           discriminator=discriminator) 

    @property 
    def parent(self): 
     """Return the parent object.""" 
     return getattr(self, "%s_parent" % self.discriminator) 
    ''' 
    @property 
    def associateds(self): 
     return getattr(self, "backref_%s" % self.discriminator) 
    ''' 
class HasPolymorphicParents(object): 

    @declared_attr 
    def association_id(self): 
     cls = self 
     foreignkey_assoc_id = "{0}_association.id".format(cls.__name__) 
     return Column(Integer, ForeignKey(foreignkey_assoc_id)) 

    @declared_attr 
    def association(self): 
     cls = self 
     association_class = "{0}Association".format(cls.__name__) 
     return relationship(association_class, 
        backref="associateds".format(cls.__name__)) 

    parent = association_proxy("association", "parent") 


class HasAssociatedsMixin(object): 
    @declared_attr 
    def association_id(self): 
     cls = self 
     associated_classname = cls.__associated__ 
     foreignkey_assoc_id = "{0}_association.id".format(associated_classname) 
     return Column(Integer, ForeignKey(foreignkey_assoc_id)) 

    @declared_attr 
    def association(self): 
     cls = self 
     discriminator = cls.__name__.lower() 

     associated_classname = cls.__associated__ 

     ########## 
     assoc_rel = 'associateds' 

     assoc_proxy = association_proxy('association', assoc_rel, 
        creator=self.__assoc_cls__.creator(discriminator) 
        ) 

     setattr(cls, assoc_rel, assoc_proxy) 
     ########## 

     association_classname = "{0}Association".format(associated_classname) 
     return relationship(association_classname, 
        backref=backref("%s_parent" % discriminator, uselist=False)) 

DecBase = declarative_base() 

class AddressAssociation(DecBase, AssociationBase,): 
    __tablename__ = "Address_association" 
    id = Column(Integer, primary_key=True) 

class Address(HasPolymorphicParents, DecBase): 
    __tablename__ = 'Addresses' 
    id = Column(Integer, primary_key=True) 
    street = Column(String) 
    city = Column(String) 
    zip = Column(String) 

class Customer(HasAssociatedsMixin, DecBase): 
    __tablename__ = 'Customers' 
    __associated__ = 'Address' 
    __assoc_rel__ = 'addresses' 
    __assoc_cls__ = AddressAssociation 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 

class Supplier(HasAssociatedsMixin, DecBase): 
    __tablename__ = 'Suppliers' 
    __associated__ = 'Address' 
    __assoc_rel__ = 'addresses' 
    __assoc_cls__ = AddressAssociation 

    id = Column(Integer, primary_key=True) 
    name = Column(String) 
    company_name = Column(String) 


os.environ['PYTHONINSPECT'] = 'True'  
eng = create_engine('sqlite://') 
DecBase.metadata.create_all(eng) 
session = sessionmaker(bind=eng)() 


session.add_all([ 
    Customer(
     name='customer 1', 
     associateds=[ 
      Address(
        street='123 anywhere street', 
        city="New York", 
        zip="10110"), 
      Address(
        street='40 main street', 
        city="San Francisco", 
        zip="95732") 
     ] 
    ), 
    Supplier(
     company_name="Ace Hammers", 
     associateds=[ 
      Address(
        street='2569 west elm', 
        city="Detroit", 
        zip="56785") 
     ] 
    ), 
]) 

session.commit() 

for customer in session.query(Customer): 
    for address in customer.addresses: 
     print address 
     print address.parent 
+0

你可以顯示你收到的錯誤嗎? – SingleNegationElimination

+0

哎呀對不起,它看起來我忘了附上錯誤。我的錯。 – Ahmed

回答

1

這是你得到的錯誤?

Traceback (most recent call last): 
    File "/tmp/test4.py", line 134, in <module> 
    associateds=[ 
    File "<string>", line 4, in __init__ 
    File "/usr/lib/python2.7/site-packages/sqlalchemy/orm/state.py", line 98, in initialize_instance 
    return manager.original_init(*mixed[1:], **kwargs) 
    File "/usr/lib/python2.7/site-packages/sqlalchemy/ext/declarative.py", line 1388, in _declarative_constructor 
    setattr(self, k, kwargs[k]) 
    File "/usr/lib/python2.7/site-packages/sqlalchemy/ext/associationproxy.py", line 201, in __set__ 
    setattr(obj, self.target_collection, creator(values)) 
    File "/tmp/test4.py", line 23, in <lambda> 
    discriminator=discriminator) 
TypeError: object.__new__() takes no parameters 
+0

是拉法達,就是這樣! – Ahmed

相關問題