sql >> Database >  >> RDS >> Mysql

Python-Sqlalchemy Binaire kolom Type HEX() en UNHEX()

Alleen voor select's en insert's

Welnu, voor selectie zou je kunnen gebruiken:

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

Voor invoegen:

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

Een betere aanpak:aangepaste kolom die gegevens converteert met behulp van sql-functies

Maar ik denk dat het beste voor jou een aangepast is kolom over sqlalchemie met behulp van een process_bind_param , process_result_value , bind_expression en column_expression zie dit voorbeeld .

Controleer deze code hieronder, het maakt een aangepaste kolom die volgens mij bij uw behoeften past:

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)

U kunt uw tafel als volgt modelleren:

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

Wat gebruik:

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

dit geeft deze vraag:

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

Meer gebruik:

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

dit geeft deze vraag:

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

Een beetje meer:

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

dit geeft deze vraag:

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

Extra:aangepaste kolom die gegevens converteert met behulp van python-typen

Misschien wil je een mooi aangepast type gebruiken en wil het converteren tussen python en de database.

In het volgende voorbeeld converteer ik UUID's tussen python en de database (de code is gebaseerd op deze 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. Navigeren door de Access 2019-openingswerkruimte

  2. Tabel bijwerken vanuit een andere tabel en een andere database

  3. Android SQLite-probleem - tabel ... heeft geen kolom met de naam

  4. Een CLOB-kolom opvragen in Oracle