2013-04-28 93 views
0

添加对象我想利用关系的对象添加到数据库中,该代码是打击:在SQLAlchemy的有关系

在Eclipse中运行的代码,数据库PostgreSQL的

from sqlalchemy import Table, MetaData, Column, ForeignKey, Integer, String, Sequence 
from sqlalchemy.orm import mapper, relationship, backref 
from sqlalchemy.engine import create_engine 
from sqlalchemy.orm.session import sessionmaker 

创建引擎和会话

engine = create_engine("postgresql+psycopg2://openpg:[email protected]:5432/testdb", echo=True) 
Session = sessionmaker(bind = engine) 
session = Session() 
metadata = MetaData() 

创建用户和Address类

user = Table('user', metadata, 
      Column('id',Integer,Sequence('user_id_seq'),primary_key=True), 
      Column('name',String(50)), 
      Column('fullname',String(50)), 
      Column('password',String(12))) 

class User(object): 
    def __init__(self, name, fullname, password): 
     self.name = name 
     self.fullname = fullname 
     self.password = password 

address = Table('address', metadata, 
       Column('id', Integer,Sequence('address_id_seq'),primary_key=True), 
       Column('user_id',Integer,ForeignKey('user.id')), 
       Column('email_address',String(50))) 

class Address(object): 
    def __init__(self, user_id, email_address): 
     self.user_id = user_id 
     self.email_address = email_address 

mapper(User,user,properties = {'addresses': relationship(Address, backref=backref('user',order_by=address.c.id))})   
mapper(Address, address) 

if __name__ == '__main__': 
    jack = User('jack', 'Jack Bean', 'gjffdd') 
    jack.addresses = [Address(email_address='[email protected]'),Address (email_address='[email protected]')] 
    session.add(jack) 
    session.commit() 

在Eclipse中运行,其结果是:

Traceback (most recent call last): 
    File "D:\workspace\test1\dbtest\testrelationship.py", line 68, in <module> 
    jack.addresses = [Address(email_address='[email protected]'),Address (email_address='[email protected]')] 
TypeError: __init__() takes exactly 3 arguments (2 given) 

我不知道如何解决这个问题,谢谢!

+0

该代码是否逐字复制?因为你在地址(email_address='[email protected]')中有一些有问题的空间。应该是地址(email_address='[email protected]')'。 – JosefAssad 2013-04-28 10:46:32

+0

空间不是重点,它只是我的疏忽。在原始的方案中,这是对的。@ JosefAssad – zimmer 2013-04-28 11:25:03

回答

0

您不提供user_id参数给Address.__init__。所以只是摆脱它:

class Address(object): 
    def __init__(self, email_address): 
     self.email_address = email_address 

和SA将负责存储在数据库中的正确值无论如何。

+0

谢谢你,你的答案很棒! @van – zimmer 2013-04-28 11:29:43