SQLAlchemy中的VALUES子句

发布于 2021-01-29 18:57:42

有没有一种方法可以Query在SQLAlchemy中构建与以下对象等效的对象:

SELECT * FROM (VALUES (1, 2, 3)) AS sq;

根据我在文档中看到的内容,该VALUES子句仅与一起使用INSERT

关注者
0
被浏览
44
1 个回答
  • 面试哥
    面试哥 2021-01-29
    为面试而生,有面试问题,就找面试哥。

    插入中的“ VALUES”是标准SQL,独立的“
    VALUES”关键字是Postgresql。PGValues上有一份针对此的快速编译器配方(如果有一天我更改了维基,请在此处复制):

    from sqlalchemy import *
    from sqlalchemy.ext.compiler import compiles
    from sqlalchemy.sql.expression import FromClause
    from sqlalchemy.sql import table, column
    
    class values(FromClause):
        def __init__(self, *args):
            self.list = args
    
        def _populate_column_collection(self):
            self._columns.update(
                [("column%d" % i, column("column%d" % i))
                        for i in xrange(1, len(self.list[0]) + 1)]
            )
    
    @compiles(values)
    def compile_values(element, compiler, asfrom=False, **kw):
        v = "VALUES %s" % ", ".join(
            "(%s)" % ", ".join(compiler.render_literal_value(elem, None) for elem in tup)
            for tup in element.list
        )
        if asfrom:
            v = "(%s)" % v
        return v
    
    if __name__ == '__main__':
        t1 = table('t1', column('a'), column('b'))
        t2 = values((1, 0.5), (2, -0.5)).alias('weights')
        print select([t1, t2]).select_from(t1.join(t2, t1.c.a==t2.c.column2))
    


知识点
面圈网VIP题库

面圈网VIP题库全新上线,海量真题题库资源。 90大类考试,超10万份考试真题开放下载啦

去下载看看