2013-05-07 76 views
0

我在sqlalchemy中遇到了以下問題。我在sqlite中創建了三個不同的表,第一個沒有任何意義,第二個與第一個和第三個有關係。所以當我想插入第一個和第二個表中的東西時,一切正常。當我想在第三張表格中插入數據時,我會遇到麻煩,當我要按照tutorial中描述的方式進行操作時。這裏是我的三個表代碼:SQLalchemy中的雙關係

第一個表:

# Save_Data_Type.py 

from sqlalchemy import ForeignKey 
from sqlalchemy import Column, Float, Integer, String 
from base import Base 
from sqlalchemy.orm import relationship, backref 

######################################################################## 
class Save_Data_Type(Base): 

__tablename__ = "save_datas_type" 

save_datas_type_id = Column(Integer, primary_key=True) 
type_memory = Column(String) 
comment = Column(String) 
dummy1 = Column(String) 
dummy2 = Column(String) 
#---------------------------------------------------------------------- 
def __init__(self, type_memory, comment, dummy1, dummy2): 
    """""" 
    self.type_memory = type_memory 
    self.comment = comment 
    self.dummy1 = dummy1 
    self.dummy2 = dummy2 

二表

# Save_Data.py 
from sqlalchemy import ForeignKey 
from sqlalchemy import Column, Float, Integer, String 
from base import Base 
from sqlalchemy.orm import relationship, backref 


######################################################################## 
class Save_Data(Base): 
"""""" 
__tablename__ = "save_datas" 

save_datas_id = Column(Integer, primary_key=True) 

save_datas_type_id = Column(Integer,ForeignKey("save_datas_type.save_datas_type_id")) 
save_datas_type = relationship("Save_Data_Type", backref=backref("save_datas", order_by=save_datas_id)) 

value = Column(Float) 

comment = Column(String) 

dummy1 = Column(String) 


#---------------------------------------------------------------------- 
def __init__(self, value, comment, dummy1): 
    """""" 
    self.value = value 
    self.comment = comment 
    self.dummy1 = dummy1 

三表

# Station.py 
from sqlalchemy import ForeignKey 
from sqlalchemy import Column, Integer, Boolean, String 
from base import Base 
from sqlalchemy.orm import relationship, backref 


######################################################################## 
class Station(Base): 
"""""" 
__tablename__ = "stations" 

stations_id = Column(Integer, primary_key=True) 
name = Column(String) 
password = Column(String) 

save_datas_id = Column(Integer,ForeignKey("save_datas.save_datas_id")) 
save_datas = relationship("Save_Data", backref=backref("stations", order_by=stations_id)) 


dummy1 = Column(String) 
dummy2 = Column(String) 
dummy3 = Column(String) 


#---------------------------------------------------------------------- 
def __init__(self, name, password, dummy1, dummy2, dummy3): 
    """""" 
    self.name = name  
    self.password = password 
    self.dummy1 = dummy1 
    self.dummy2 = dummy2 
    self.dummy3 = dummy3 

base.py

# base.py 

from sqlalchemy.ext.declarative import declarative_base 
Base = declarative_base() 

所以,如果我要插入DATAS這樣的:在數據庫中的第三個表

from sqlalchemy import create_engine 
from sqlalchemy.orm import sessionmaker 

import base 

from Save_Data_Type import Save_Data_Type 
from Save_Data import Save_Data 
from Station import Station 

engine = create_engine('sqlite:///Database.db', echo=True) 

base.Base.metadata.create_all(engine, checkfirst=True) 

# create a Session 
Session = sessionmaker(bind=engine) 
session = Session() 


jack = Save_Data_Type("Ring Memory",'In seconds',None,None) 
jack.save_datas = [Save_Data(1980,'Sometimes more, sometimes less',None)] 
jack.save_datas.stations = [Station('name1','123456',None,None,None)] 

session.add(jack) 

session.commit() 

什麼也不寫。通常的方式來建立這種關係如何?

由於提前,

約翰內斯

+0

還是更要刪除所有關係,並通過查詢添加ForeignKey的手工表? – runjojo2 2013-05-08 07:05:43

+0

你的例子有兩個名爲「Save_Data」的類,應該命名爲「Save_Data_Type」嗎? – zzzeek 2013-05-08 19:42:06

回答

0
從代碼中的一些錯字

除了您發佈(請參閱從zzzeek評論),它看起來像這個問題將被替換的代碼來解決:

jack.save_datas.stations = [Station('name1','123456',None,None,None)] 

與下面的一個:

jack.save_datas[0].stations = [Station('name1','123456',None,None,None)] 

原因是跟隨着g:在你的情況下,你爲類成員分配/創建一個stations屬性。這不但不能做正確的工作,它可能實際上損害了你的ORM模型。 在第二種情況下,您正確Station實例分配給第一個save_datas
更清晰的代碼應該是這樣的:

jack = Save_Data_Type("Ring Memory",'In seconds',None,None) 

save_data1 = Save_Data(1980,'Sometimes more, sometimes less',None) 
jack.save_datas.append(save_data1) 
# or: jack.save_datas = [save_data1] 
# or (my favourite): save_data1.Save_Data_Type = jack 

save_data1.stations = [Station('name1','123456',None,None,None)] 
# or... similar to the relationship above