邻接列表关系帮助程序(仅使用数据库自己的实现)

sqla-hierarch的Python项目详细描述


————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————————将正确表示行之间层次关系的额外列。然后可以执行返回的hierarchy对象,它将返回提交的同一select语句以及以下列:

-level:与其父行相关的行的相对级别
-connect_path:包含构成此部分的所有id的列表对于层次结构,从根节点到当前值(**important**:oracle需要一些额外的后处理来生成列表)
-is_leaf:boolean表示特定id是否是一个叶

层次结构中的级别

特殊说明:

-所选表必须具有自引用外键关系,否则将引发missingForeignKey
-并非每个数据库都受支持(目前)。检查全局var-supported\u-db以获得一个拔出的列表。尝试使用不受支持的数据库执行层次结构将引发NotImplementederror或Hierarchylessererror(请检查错误类docstring中每个错误的确切含义)。
-以防止查询将每个节点作为不同的起始节点返回,从而使dupl如果有值,可以在kwargs中提供"starting_node"参数。必须提供的值是要开始构建层次结构树的根节点的父ID。由于我们在查询中执行合并函数,因此没有一个与"0"具有相同的含义。默认情况下,系统将添加"starting_node"="0"。如果不需要启动节点,请传递"starting_node"=false,则该子句将不会添加到查询中

*支持的数据库*:

-postgresql(>;=8.4.0)
-oracle(>;=10g)


*我们可能在一个ne上支持的数据库xt版本*:

-sql server
-db2

*我们知道不支持的数据库*(因为它们不实现递归):

-mysql
-sqlite

----
一些示例
----


首先,让我们设置一些要使用的导入和变量:

>;>;从sqlalchemy导入表、列、外键、元数据、创建引擎中导入configparser
>;
>>>>从sqlalchemy import unicode中,选择并"从sqlalchemy.orm导入映射器、关系、作用域会话、sessionmaker
>;>从sqla_层次结构导入*
>;>dbsession=作用域会话(sessionmaker())
>;>;metadata=metadata()
>;>;config=configparser.configparser()
>;>;config.read('setup.cfg')
['setup.cfg']
>;>;engine=create_engine('postgresql://%s'%config.get('dburi','pg-db'))
>;>dbsession.configure(bind=engine)
>;>metadata.bind=engine


…列('id',unicode,primary_key=true),
…列('boss',unicode,foreignkey('employee.id'))
>;>gt;类雇员(对象):
…德夫尼尼特(self,employee,boss=无):
…self.id=员工
…self.boss=老板
…定义代表(自我):
…返回"<;员工%s,老板%s>;"%(self.id,self.boss)

>;>mapper(员工,例如tb,properties={doctest:+省略号
…)父级:关系(employee,remote_side=[example撸tb.c.id])}
<;映射器位于x…;employee>;
>;>example撸tb.drop(checkfirst=true)
>;>example撸tb.create(checkfirst=true)

add some data::

>;>pl=[employee(u'king c旧的,没有的),雇员(u'frieza',u'king cold'),
…雇员(u'zarbon,u'frieza'),雇员(u'dodoria,u'frieza'),
…员工(你叫金玉队长,你叫弗里扎"),
…员工(u'jeice,u'captain ginyu'),
…员工(u'burter,u'captain ginyu'),
…员工(你是"recoome",你是"ginyu船长"),
…员工(古尔多,金玉队长),
…雇员(u'dr gero',无),雇员(u'a-16',u'dr gero'),
…雇员(U'A-17,U'Dr Gero'),雇员(U'A-18,U'Dr Gero'),
…employee(u'cell',u'dr gero'),employee(u'cell junior',u'cell')]
>;>dbsession.add_all(pl)
>;>dbsession.commit()

首先,我们希望老板和员工的列表使用一些缩进来直观地了解谁取决于谁:

>;>qry=层次结构(dbsession,例如tb,select([示例tb])
>;>rs=dbsession.execute(qry).fetchall()
>;
如果ev.level==1:
…打印(ev.id)
…其他:
…打印("*2*ev.level+ev.id)
gero医生
a-16
a-17
a-18
小室
大冷天
弗里萨
金玉船长
伯特
古尔多
jeice
recoom
dodoria
zarbon


让我们看看sqla_hierachy添加的特殊属性:

>;>print(rs[0])
(u'dr gero',none,1,['dr gero',false)

*level*:t这张唱片在树上的相对位置。1'表示他/她是根。数字越大,根与当前记录之间的距离越大::

>;>;打印(rs[0].level)
1

*连接路径*:打印此关系的完整成员列表:从根到当前记录::

>;打印(rs[0].connect\u path)
['dr gero']

*is leaf*:如果is\u leaf为true,则此记录不再有依赖项。如果为False,则会有更多依赖于他/她的记录:

>;>;打印(rs[0].是叶子)
False

打印(rs[9].connect_path)
['冷王','弗里萨','金玉船长','伯特']

…_表:http://www.sqlalchemy.org/docs/core/schema.html\sqlalchemy.schema.table
。_选择:http://www.sqlalchemy.org/docs/core/expressionpi.html sqlalchemy.sql.expression.select_

欢迎加入QQ群-->: 979659372 Python中文网_新手群

推荐PyPI第三方库


热门话题
JavaGWT:何时使用Lazydemelement?   Java中跟踪消失线程的多线程处理   java Springboot未能配置数据源:“url”,但我没有使用数据库   java为按钮生成随机位置   math Java:包含二项式系数计算的表达式   java通过AsyncTask传递参数   从路径错误创建java文件   高流量网站的性能播放框架、Java、Apache、PostgreSQL、JPA和Hibernate   java将4D矢量转换为长矢量   arraylist Java循环在没有任何错误的情况下终止   java正在制作一个计算器应用程序,希望在第二个片段中更新历史,但无法完成   java将信息从IntentService发送到Activity   java如何在游戏中插入大量实体!工作   javascript如何在ScriptEngineforJava中从数学中获得准确的结果?