Database design sqlalchemy图形数据库数据操作
我正在设计一个图形数据库结构。节点可以是个人、部门等。这就是我添加nodeType的原因。节点之间的关系也可以是多种类型。 从下面的代码中,r1和r2被插入数据库。当我读取数据库时,我看到null。为什么呢? 我希望看到与.id字段相关的值(例如n1.id、rt1.id、n2.id)Database design sqlalchemy图形数据库数据操作,database-design,graph,sqlalchemy,Database Design,Graph,Sqlalchemy,我正在设计一个图形数据库结构。节点可以是个人、部门等。这就是我添加nodeType的原因。节点之间的关系也可以是多种类型。 从下面的代码中,r1和r2被插入数据库。当我读取数据库时,我看到null。为什么呢? 我希望看到与.id字段相关的值(例如n1.id、rt1.id、n2.id) 对代码改进的其他评论也值得赞赏。代码的问题是,在将节点插入数据库之前,您试图使用Node.id属性。在调用session.flush()或session.commit()之前,新创建的对象没有id,也不能,因为生成
对代码改进的其他评论也值得赞赏。代码的问题是,在将节点插入数据库之前,您试图使用Node.id属性。在调用
session.flush()
或session.commit()
之前,新创建的对象没有id,也不能,因为生成id的是DB引擎
因此SQLAlchemy实现这一点的方法是定义关系
对象和节点
对象之间的关系,并在关系中分配对象。就这样,
from sqlalchemy import MetaData, Table, Column, Integer, ForeignKey, \
create_engine, String
from sqlalchemy.orm import mapper, relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///dir_graph.sqlite', echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class NodeType(Base):
__tablename__ = 'nodetype'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
nodes = relationship('Node', backref='nodetype')
def __init__(self, name):
self.name = name
def __repr__(self):
return "Nodetype: %s" % self.name
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
type_id = Column(Integer,
ForeignKey('nodetype.id'))
def __init__(self, _name, _type_id):
self.name = _name
self.type_id = _type_id
class Relation(Base):
__tablename__ = 'relation'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
type_id = Column(Integer,
ForeignKey('relationtype.id'))
from_id = Column(Integer,
ForeignKey('node.id'))
to_id = Column(Integer,
ForeignKey('node.id'))
from_node = relationship(Node, primaryjoin=Node.id == from_id)
to_node = relationship(Node, primaryjoin=Node.id == to_id)
def __init__(self, _fromNode, _type_id, _toNode):
self.from_node = _fromNode
self.type_id = _type_id
self.to_node = _toNode
class RelationType(Base):
__tablename__ = 'relationtype'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
description = Column(String(30), unique=True)
relations = relationship('Relation', backref='relationtype')
def __init__(self, _name):
self.name = _name
def description(self, _description):
self.description = _description
Base.metadata.create_all(engine)
nt1 = NodeType('nt1')
nt2 = NodeType('nt2')
n1 = Node('n1type1', 1)
n2 = Node('n2type1', 1)
n3 = Node('n3type1', 1)
n4 = Node('n4type2', 2)
n5 = Node('n5type2', 2)
rt1 = RelationType('rt1')
rt2 = RelationType('rt2')
rt3 = RelationType('rt3')
r1 = Relation(n1, rt1.id, n2)
r2 = Relation(n3, rt2.id, n5)
session.add_all([nt1, nt2, n1, n2, n3, n4, n5, rt1, rt2, rt3, r1, r2])
session.commit()
您必须指定“读取数据库”的含义。您试图运行的查询是什么,它返回意外的空值?运行代码后,我使用SQLiteStudio读取数据库。在表关系中,我看到:id:1 name:null type:id:null from_id:null to_id:null对于id:2tanks相同,现在可以正常工作了。当我在代码运行后与解释器交互时,我得到一个线程错误。e、 g.r3=关系(n4,rt2.id,n5)是什么导致线程错误?(对不起,我是新手)谢谢
from sqlalchemy import MetaData, Table, Column, Integer, ForeignKey, \
create_engine, String
from sqlalchemy.orm import mapper, relationship, sessionmaker
from sqlalchemy.ext.declarative import declarative_base
engine = create_engine('sqlite:///dir_graph.sqlite', echo=True)
Base = declarative_base()
Session = sessionmaker(bind=engine)
session = Session()
class NodeType(Base):
__tablename__ = 'nodetype'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
nodes = relationship('Node', backref='nodetype')
def __init__(self, name):
self.name = name
def __repr__(self):
return "Nodetype: %s" % self.name
class Node(Base):
__tablename__ = 'node'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
type_id = Column(Integer,
ForeignKey('nodetype.id'))
def __init__(self, _name, _type_id):
self.name = _name
self.type_id = _type_id
class Relation(Base):
__tablename__ = 'relation'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
type_id = Column(Integer,
ForeignKey('relationtype.id'))
from_id = Column(Integer,
ForeignKey('node.id'))
to_id = Column(Integer,
ForeignKey('node.id'))
from_node = relationship(Node, primaryjoin=Node.id == from_id)
to_node = relationship(Node, primaryjoin=Node.id == to_id)
def __init__(self, _fromNode, _type_id, _toNode):
self.from_node = _fromNode
self.type_id = _type_id
self.to_node = _toNode
class RelationType(Base):
__tablename__ = 'relationtype'
id = Column(Integer, primary_key=True)
name = Column(String(20), unique=True)
description = Column(String(30), unique=True)
relations = relationship('Relation', backref='relationtype')
def __init__(self, _name):
self.name = _name
def description(self, _description):
self.description = _description
Base.metadata.create_all(engine)
nt1 = NodeType('nt1')
nt2 = NodeType('nt2')
n1 = Node('n1type1', 1)
n2 = Node('n2type1', 1)
n3 = Node('n3type1', 1)
n4 = Node('n4type2', 2)
n5 = Node('n5type2', 2)
rt1 = RelationType('rt1')
rt2 = RelationType('rt2')
rt3 = RelationType('rt3')
r1 = Relation(n1, rt1.id, n2)
r2 = Relation(n3, rt2.id, n5)
session.add_all([nt1, nt2, n1, n2, n3, n4, n5, rt1, rt2, rt3, r1, r2])
session.commit()