2013-04-28 89 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