sql >> データベース >  >> RDS >> PostgreSQL

カスタムコンパイル式でbindparam()を利用するにはどうすればよいですか?

    わかった。 bindparamsの実際の値は、SQLCompilerというオブジェクトに保持されます。 これは一般的に方言固有です。こちら(GitHubへのリンク) bindparamsがSQLCompilerに格納される場所です クエリコンパイルプロセス中のインスタンス

    したがって、私のコードスニペットの最終バージョンは次のようになります。

    class values(FromClause):
        named_with_column = True
    
        def __init__(self, columns, *args, **kw):
            self._column_args = columns
            self.list = args
            self.alias_name = self.name = kw.pop('alias_name', None)
    
        def _populate_column_collection(self):
            # self._columns.update((col.name, col) for col in self._column_args)
            for c in self._column_args:
                c._make_proxy(self, c.name)
    
    
    @compiles(values)
    def compile_values(clause, compiler, asfrom=False, **kw):
        def decide(value, column):
            add_type_hint = False
            if isinstance(value, array) and not value.clauses:  # for empty array literals
                add_type_hint = True
    
            if isinstance(value, ClauseElement):
                intermediate = compiler.process(value)
                if add_type_hint:
                    intermediate += '::' + str(column.type)
                return intermediate
    
            elif value is None:
                return compiler.render_literal_value(
                    value,
                    NULLTYPE
                ) + '::' + str(column.type)
            else:
                return compiler.process(
                    bindparam(
                        None,
                        value=compiler.render_literal_value(
                            value,
                            column.type
                        ).strip("'")
                    )
                ) + '::' + str(column.type)
    
        columns = clause.columns
        v = "VALUES %s" % ", ".join(
            "(%s)" % ", ".join(
                decide(elem, column)
                for elem, column in zip(tup, columns))
            for tup in clause.list
        )
        if asfrom:
            if clause.alias_name:
                v = "(%s) AS %s (%s)" % (v, clause.alias_name, (", ".join(c.name for c in clause.columns)))
            else:
                v = "(%s)" % v
        return v
    



    1. Java +MysqlUTF8の問題

    2. 弱実体のデータベースモデリング

    3. PostgreSQLを使用したSQLAlchemyテストでのデータベースの作成

    4. この複雑なクエリをcodeigniterでどのように記述しますか?