PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm cách nào để sử dụng bindparam () trong một biểu thức được biên dịch tùy chỉnh?

Tôi hiểu rồi. Các giá trị thực của bindparams được giữ trong một đối tượng có tên là SQLCompiler thường là phương ngữ cụ thể. Đây (liên kết tới GitHub) là nơi các bindparams được lưu trữ trong một SQLCompiler ví dụ trong quá trình biên dịch truy vấn

Vì vậy, phiên bản cuối cùng của đoạn mã của tôi trông giống như sau:

Giá trị lớp
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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng nhiều lược đồ PostgreSQL với các mô hình Rails

  2. ĐẶT HÀNG tùy chỉnh theo giải thích

  3. Các giao dịch không hoạt động cho MySQL DB của tôi

  4. Nhận mã hóa cơ sở dữ liệu Postgres

  5. không thể ghi vào tệp nhật ký pg_upgrade_internal.log khi nâng cấp từ Postgresql 9.1 lên 9.3