【问题标题】:Double Relationship in SQLalchemySQLalchemy 中的双重关系
【发布时间】:2013-05-01 10:13:30
【问题描述】:

我在 sqlalchemy 中遇到了以下问题。我在sqlite中做了三个不同的表,第一个没有关系,第二个与第一个有关系,第三个与第二个有关系。因此,当我想在第一个和第二个表中插入东西时,一切正常。当我想在第三个表中插入数据时,我会遇到麻烦,就像tutorial 中描述的那样。这是我的三个表的代码:

第一个表:

# 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()

所以如果我要插入这样的数据:

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()

数据库的第三个表中没有写入任何内容。建立这种关系的常用方法是什么?

提前致谢,

约翰内斯

【问题讨论】:

  • 还是删除所有关系,通过查询将ForeignKey手动添加到表中?
  • 您的示例有两个名为“Save_Data”的类,一个应该命名为“Save_Data_Type”吗?

标签: database insert sqlalchemy relationship


【解决方案1】:

除了您发布的代码中的一些拼写错误(参见 zzzeek 的评论),看起来问题将通过替换代码来解决:

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

下面的一个:

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

原因如下:在您的情况下,您将 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

【讨论】:

    猜你喜欢
    • 2017-05-03
    • 1970-01-01
    • 1970-01-01
    • 2015-10-21
    • 2023-03-17
    • 2013-10-22
    • 2018-05-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多