Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Kolumna binarna Python-Sqlalchemy typu HEX() i UNHEX()

Tylko dla wybranych i wstawek

Cóż, do wyboru możesz użyć:

>>> 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(?)

Do wstawienia:

>>> 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))

Lepsze podejście:niestandardowa kolumna, która konwertuje dane za pomocą funkcji sql

Ale myślę, że najlepszy dla ciebie jest niestandardowy kolumna o sqlalchemy przy użyciu dowolnego process_bind_param , process_result_value , bind_expression i column_expression zobacz ten przykład .

Sprawdź poniższy kod, tworzy on niestandardową kolumnę, która moim zdaniem pasuje do Twoich potrzeb:

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)

Możesz wymodelować swój stół w następujący sposób:

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

Niektóre zastosowania:

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

to wysyła to zapytanie:

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

Więcej użycia:

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

to wysyła to zapytanie:

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

Nieco więcej:

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

to wysyła to zapytanie:

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

Dodatkowe:niestandardowa kolumna, która konwertuje dane przy użyciu typów Pythona

Może chcesz użyć pięknego niestandardowego typu i chcesz przekonwertować go między Pythonem a bazą danych.

W poniższym przykładzie konwertuję UUID między Pythonem a bazą danych (kod jest oparty na tym link ):

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. Upuścić unikalny klucz wielokolumnowy bez upuszczania klucza obcego?

  2. MySQL ERROR 1290 (HY000) -- opcja Secure-File-priv

  3. Błąd:obiekt klasy CI_DB_mysql_result nie mógł zostać przekonwertowany na ciąg

  4. Hibernate-envers zgłasza wyjątek podczas usuwania jednostki z kolekcją przy użyciu CrudRepository

  5. Naruszenie ograniczenia integralności:1052 Kolumna „id”, w której klauzula jest niejednoznaczna