免责声明:我是SQLAlchemy的完全新手(我正在尝试学习),因此我可能忽略了显而易见的内容。
我有多对多关系,需要更新以添加新记录。
记录应该保持一致(当然!),并且仅在不存在的情况下才添加。
我的暂定代码如下:
from sqlalchemy import Table, Column, String, ForeignKey, create_engine
from sqlalchemy.orm import relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
sqlite_file = './zt1.sqlite'
Base = declarative_base()
link = Table(
'link', Base.metadata,
Column('nwid', String, ForeignKey('netw.nwid')),
Column('ndid', String, ForeignKey('node.ndid'))
)
class Node(Base):
__tablename__ = 'node'
ndid = Column(String, primary_key=True)
name = Column(String)
netw = relationship('Netw', secondary='link')
class Netw(Base):
__tablename__ = 'netw'
nwid = Column(String, primary_key=True)
name = Column(String)
node = relationship('Node', secondary='link')
engine = create_engine('sqlite:///' + sqlite_file)
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
def put(nwid, nwnm, ndid, name=None):
s = session()
node = Node(ndid=ndid, name=name)
s.add(node)
netw = Netw(nwid=nwid, name=nwnm)
netw.node.append(node)
s.add(netw)
s.commit()
def get_nets():
s = session()
n = s.query(Netw)
li = [i.nwid for i in n]
return li
def get_nods(nwid):
s = session()
n = s.query(Node).filter(Netw.nwid == nwid)
li = [i.ndid for i in n]
return li
if __name__ == '__main__':
put('7122698ebdeb0534', 'TestNet', '69369ae729')
put('7122698ebdeb0534', 'TestNet', '7122698ebd')
ls = get_nets()
for l in ls:
get_nods(l)
这显然失败了,因为它尝试两次添加“ netw”。
是否有可用的快捷方式?或者如果没有找到,我应该经历获取网络并将其添加的循环吗?
注意:我将仅添加“链接”,根据需要创建基础数据,或“更新”数据以将列值添加到已创建的对象中。