Python SQLAlchemy示例“;“处理多个连接路径”;抛出异常
我试图做一些类似于以下示例的事情: 当我执行以下脚本时:Python SQLAlchemy示例“;“处理多个连接路径”;抛出异常,python,database,sqlalchemy,Python,Database,Sqlalchemy,我试图做一些类似于以下示例的事情: 当我执行以下脚本时: #!/usr/bin/python from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String from sqlalchemy.orm import sessionmaker from sqlalchemy import
#!/usr/bin/python
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import ForeignKey
from sqlalchemy.orm import relationship, backref
from sqlalchemy.orm import aliased
engine = create_engine('sqlite:///demo.db', echo=True)
Base = declarative_base()
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __init__(self, name, fullname, password):
self.name = name
self.fullname = fullname
self.password = password
def __repr__(self):
return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
class Address(Base):
__tablename__ = 'addresses'
id = Column(Integer, primary_key=True)
email_address = Column(String, nullable=False)
user_id = Column(Integer, ForeignKey('users.id'))
user = relationship("User", backref=backref('addresses', order_by=id), passive_deletes=True)
user2 = relationship("User", backref=backref('addresses2', order_by=id), passive_deletes=True)
def __init__(self, email_address):
self.email_address = email_address
def __repr__(self):
return "<Address('%s')>" % self.email_address
class Customer(Base):
__tablename__ = 'customer'
id = Column(Integer, primary_key=True)
name = Column(String)
billing_address_id = Column(Integer, ForeignKey("addresses.id"))
shipping_address_id = Column(Integer, ForeignKey("addresses.id"))
billing_address = relationship("Address", foreign_keys=[billing_address_id])
shipping_address = relationship("Address", foreign_keys=[shipping_address_id])
def test():
print "Testing .."
# Test code.
if __name__ == '__main__':
test()
#/usr/bin/python
从sqlalchemy导入创建引擎
从sqlalchemy.ext.declarative导入声明性基础
从sqlalchemy导入列,整数,字符串
从sqlalchemy.orm导入sessionmaker
从sqlalchemy导入外键
从sqlalchemy.orm导入关系,backref
从sqlalchemy.orm导入别名
引擎=创建引擎('sqlite:///demo.db,echo=True)
Base=声明性_Base()
类用户(基本):
__tablename_uu='users'
id=列(整数,主键=True)
名称=列(字符串)
fullname=列(字符串)
密码=列(字符串)
定义初始化(self、name、fullname、password):
self.name=名称
self.fullname=fullname
self.password=密码
定义报告(自我):
返回“”%(self.name、self.fullname、self.password)
班级地址(基本地址):
__tablename_uu='地址'
id=列(整数,主键=True)
电子邮件地址=列(字符串,可空=假)
user\u id=列(整数,ForeignKey('users.id'))
用户=关系(“用户”,backref=backref('addresses',order\u by=id),被动\u deletes=True)
user2=关系(“User”,backref=backref('addresses2',order\u by=id),被动\u deletes=True)
定义初始化(自我,电子邮件地址):
self.email\u address=电子邮件地址
定义报告(自我):
返回“%self.email\u地址”
类别客户(基本):
__tablename_uuu=‘客户’
id=列(整数,主键=True)
名称=列(字符串)
账单地址id=列(整数,外键(“addresses.id”))
shipping\u address\u id=列(整数,ForeignKey(“addresses.id”))
账单地址=关系(“地址”,外键=[账单地址\u id])
配送地址=关系(“地址”,外键=[配送地址\u id])
def test():
打印“测试…”
#测试代码。
如果uuuu name uuuuuu='\uuuuuuu main\uuuuuuu':
测试()
我明白了
2013-06-30 12:56:53938信息sqlalchemy.engine.base.engine PRAGMA表\u信息(“用户”)
2013-06-30 12:56:53938信息sqlalchemy.engine.base.engine()
2013-06-30 12:56:53939信息sqlalchemy.engine.base.engine PRAGMA表信息(“地址”)
2013-06-30 12:56:53940信息sqlalchemy.engine.base.engine()
2013-06-30 12:56:53940信息sqlalchemy.engine.base.engine PRAGMA表信息(“客户”)
2013-06-30 12:56:53940信息sqlalchemy.engine.base.engine()
回溯(最近一次呼叫最后一次):
文件“/test.py”,第131行,在
测试()
文件“/test.py”,第70行,在测试中
ed_user=用户('ed','ed Jones','edspassword'))
文件“”,第2行,在_init中__
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/instrumentation.py”,第309行,处于“新”状态,如果没有
state=self.\u state\u构造函数(实例,self)
文件“/usr/lib/python2.7/dist packages/sqlalchemy/util/langhelpers.py”,第494行,在__
obj.\uuuuu dict\uuuuu[self.\uuuuuuuuuuu name\uuuuuuuuu]=结果=self.fget(obj)
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/instrumentation.py”,第157行,处于“状态”
self.dispatch.first_init(self,self.class_)
文件“/usr/lib/python2.7/dist packages/sqlalchemy/event.py”,第377行,在调用中__
fn(*参数,**千瓦)
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/mapper.py”,第2347行,在第一次初始化的事件中
配置映射器()
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/mapper.py”,第2263行,在configure_mappers中
映射程序。_post_configure_properties()
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/mapper.py”,第1172行,在“post\u configure\u properties”中
prop.init()
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/interfaces.py”,第128行,在init中
self.do_init()
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/properties.py”,第911行,在do_init中
self.\u determine\u joins()
文件“/usr/lib/python2.7/dist packages/sqlalchemy/orm/properties.py”,第1048行,在
%(自我)
sqlalchemy.exc.ArgumentError:无法确定关系Customer.u地址上的父/子表之间的联接条件。指定“primaryjoin”表达式。如果存在“secondary”,则还需要“secondaryjoin”。
我希望这个示例能够开箱即用,而不必将primaryjoin作为参数添加到relationship()。我要说的是,这不是SQLAlchemy 0.8,很可能是0.7版本。确保您使用的是0.8,在以前的版本中,在更多情况下需要primaryjoin(请参阅)
2013-06-30 12:56:53,938 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("users")
2013-06-30 12:56:53,938 INFO sqlalchemy.engine.base.Engine ()
2013-06-30 12:56:53,939 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("addresses")
2013-06-30 12:56:53,940 INFO sqlalchemy.engine.base.Engine ()
2013-06-30 12:56:53,940 INFO sqlalchemy.engine.base.Engine PRAGMA table_info("customer")
2013-06-30 12:56:53,940 INFO sqlalchemy.engine.base.Engine ()
Traceback (most recent call last):
File "./test.py", line 131, in <module>
test()
File "./test.py", line 70, in test
ed_user = User('ed', 'Ed Jones', 'edspassword')
File "<string>", line 2, in __init__
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/instrumentation.py", line 309, in _new_state_if_none
state = self._state_constructor(instance, self)
File "/usr/lib/python2.7/dist-packages/sqlalchemy/util/langhelpers.py", line 494, in __get__
obj.__dict__[self.__name__] = result = self.fget(obj)
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/instrumentation.py", line 157, in _state_constructor
self.dispatch.first_init(self, self.class_)
File "/usr/lib/python2.7/dist-packages/sqlalchemy/event.py", line 377, in __call__
fn(*args, **kw)
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 2347, in _event_on_first_init
configure_mappers()
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 2263, in configure_mappers
mapper._post_configure_properties()
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/mapper.py", line 1172, in _post_configure_properties
prop.init()
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/interfaces.py", line 128, in init
self.do_init()
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/properties.py", line 911, in do_init
self._determine_joins()
File "/usr/lib/python2.7/dist-packages/sqlalchemy/orm/properties.py", line 1048, in _determine_joins
% self)
sqlalchemy.exc.ArgumentError: Could not determine join condition between parent/child tables on relationship Customer.billing_address. Specify a 'primaryjoin' expression. If 'secondary' is present, 'secondaryjoin' is needed as well.