J'ai une table sqlalchemy comme ceci:Comment puis-je déterminer si un PGArray est inclus dans un autre utilisant des sessions SQLAlchemy?
table = sql.Table('treeItems', META,
sql.Column('id', sql.Integer(), primary_key=True),
sql.Column('type', sql.String, nullable=False),
sql.Column('parentId', sql.Integer, sql.ForeignKey('treeItems.id')),
sql.Column('lineage', PGArray(sql.Integer)),
sql.Column('depth', sql.Integer),
)
Ce qui est mis en correspondance avec un objet comme ceci:
orm.mapper(TreeItem, TreeItem.table, polymorphic_on=TreeItem.table.c.type, polymorphic_identity='TreeItem')
J'aimerais sélectionner un nœud enfant d'un nœud donné si ce que je m est à la recherche de SQL qui ressemble à ceci (pour un parent avec pk = 2):
SELECT *
FROM "treeItems"
WHERE ARRAY[2] <@ "treeItems".lineage AND "treeItems".id != 2
ORDER BY "treeItems".lineage
Voici le code sqlalchemy/Python-je utiliser pour essayer d'obtenir le SQL ci-dessus avec peu de chance:
arrayStr = 'ARRAY[%s]' % ','.join([str(i) for i in self.lineage])
lineageFilter = expr.text('%s <@ %s' % (arrayStr, TreeItem.table.c.lineage))
query = SESSION.query(TreeItem).filter(expr.and_(lineageFilter, TreeItem.table.c.id!=self.id))
Mais voici le SQL que je le vent avec (notez l'absence de guillemets autour du nom de la table TreeItems dans la clause where):
SELECT "treeItems".id AS "treeItems_id", "treeItems".type AS "treeItems_type", "treeItems"."parentId" AS "treeItems_parentId", "treeItems".lineage AS "treeItems_lineage", "treeItems".depth AS "treeItems_depth"
FROM "treeItems"
WHERE ARRAY[2] <@ treeItems.lineage AND "treeItems".id != %(id_1)s
Alors, maintenant les questions suivantes:
Existe-t-il une meilleure façon de faire cela que d'utiliser l'expression text()/Existe-t-il un opérateur ou une expression dans SqlAlchemy qui peut faire < @ avec PGArray? Comment puis-je obtenir les guillemets pour apparaître autour de mon nom de table si je dois utiliser l'expression text()?
Merci à tous!