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

Loại cột nhị phân trong Python-Sqlalchemy HEX () và UNHEX ()

Chỉ cho phần được chọn và phần chèn

Chà, bạn có thể sử dụng để chọn:

>>> from sqlalchemy import func
>>> session = (...)
>>> (...)
>>> engine = create_engine('sqlite:///:memory:', echo=True)
>>> q = session.query(Model.id).filter(Model.some == func.HEX('asd'))
>>> print q.statement.compile(bind=engine)
SELECT model.id
FROM model
WHERE model.some = HEX(?)

Đối với chèn:

>>> from sqlalchemy import func
>>> session = (...)
>>> (...)
>>> engine = create_engine('sqlite:///:memory:', echo=True)
>>> m = new Model(hash=func.HEX('asd'))
>>> session.add(m)
>>> session.commit()
INSERT INTO model (hash) VALUES (HEX(%s))

Một cách tiếp cận tốt hơn:Cột tùy chỉnh chuyển đổi dữ liệu bằng cách sử dụng các hàm sql

Tuy nhiên, tôi nghĩ điều tốt nhất cho bạn là tùy chỉnh cột về sqlalchemy sử dụng bất kỳ process_bind_param , process_result_value , bind_expression column_expression xem ví dụ này"> .

Kiểm tra mã này bên dưới, nó tạo ra một cột tùy chỉnh mà tôi nghĩ phù hợp với nhu cầu của bạn:

from sqlalchemy.types import VARCHAR
from sqlalchemy import func

class HashColumn(VARCHAR):

    def bind_expression(self, bindvalue):
        # convert the bind's type from String to HEX encoded 
        return func.HEX(bindvalue)

    def column_expression(self, col):
        # convert select value from HEX encoded to String
        return func.UNHEX(col)

Bạn có thể lập mô hình bảng của mình như:

from sqlalchemy import Column, types
from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class Model(Base):
    __tablename__ = "model"
    id = Column(types.Integer, primary_key=True)
    col = Column(HashColumn(20))

    def __repr__(self):
        return "Model(col=%r)" % self.col

Một số cách sử dụng:

>>> (...)
>>> session = create_session(...)
>>> (...)
>>> model = Model(col='Iuri Diniz')
>>> session.add(model)
>>> session.commit()

vấn đề này gây ra truy vấn này:

INSERT INTO model (col) VALUES (HEX(?)); -- ('Iuri Diniz',)

Sử dụng nhiều hơn:

>>> session.query(Model).first()
Model(col='Iuri Diniz')

vấn đề này gây ra truy vấn này:

SELECT 
    model.id AS model_id, UNHEX(model.col) AS model_col 
FROM model 
LIMIT ? ; -- (1,)

Thêm một chút:

>>> session.query(Model).filter(Model.col == "Iuri Diniz").first()
Model(col='Iuri Diniz')

vấn đề này gây ra truy vấn này:

SELECT 
    model.id AS model_id, UNHEX(model.col) AS model_col 
FROM model 
WHERE model.col = HEX(?) 
LIMIT ? ; -- ('Iuri Diniz', 1)

Thêm:Cột tùy chỉnh chuyển đổi dữ liệu bằng cách sử dụng các loại python

Có thể bạn muốn sử dụng một số loại tùy chỉnh đẹp mắt và muốn chuyển đổi nó giữa python và cơ sở dữ liệu.

Trong ví dụ sau, tôi chuyển đổi UUID giữa python và cơ sở dữ liệu (mã dựa trên điều này liên kết ):

import uuid
from sqlalchemy.types import TypeDecorator, VARCHAR

class UUID4(TypeDecorator):
    """Portable UUID implementation

    >>> str(UUID4())
    'VARCHAR(36)'
    """

    impl = VARCHAR(36)

    def process_bind_param(self, value, dialect):
        if value is None:
            return value
        else:
            if not isinstance(value, uuid.UUID):
                return str(uuid.UUID(value))
            else:
                # hexstring
                return str(value)

    def process_result_value(self, value, dialect):
        if value is None:
            return value
        else:
            return uuid.UUID(value)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm thế nào để chuyển đổi Cơ sở dữ liệu MySql window-1251 (nga cyrillic) sang UTF-8

  2. Làm cách nào để gọi một thủ tục được lưu trữ trên máy chủ MySQL Ubuntu từ xa?

  3. Hibernate tham gia hai bảng và tạo phản hồi json trong dịch vụ web yên tĩnh mùa xuân?

  4. Lỗi java.lang.ClassNotFoundException:com.mysql.jdbc.Driver khi chạy JAR thông qua dòng lệnh

  5. Chạy mysql_upgrade trong Docker?