Mysql
 sql >> база данни >  >> RDS >> Mysql

Python-Sqlalchemy Двоична колона Тип HEX() и UNHEX()

Само за избрани и вмъкнати

Е, за избор можете да използвате:

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

За вмъкване:

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

По-добър подход:Персонализирана колона, която преобразува данни с помощта на sql функции

Но мисля, че най-доброто за вас е по избор колона за sqlalchemy като използвате всеки process_bind_param , process_result_value , bind_expression и column_expression вижте този пример .

Проверете този код по-долу, той създава персонализирана колона, която според мен отговаря на вашите нужди:

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)

Можете да моделирате вашата таблица като:

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

Някои употреби:

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

това издава тази заявка:

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

Повече използване:

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

това издава тази заявка:

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

Още малко:

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

това издава тази заявка:

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

Допълнително:Персонализирана колона, която преобразува данни чрез използване на типове python

Може би искате да използвате красив персонализиран тип и искате да го конвертирате между python и базата данни.

В следващия пример преобразувам UUID между python и базата данни (кодът е базиран на този връзка ):

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. Извличане на MySQL полета от ред в PHP променливи и масив

  2. Активирайте отдалечен достъп до базата данни MySQL

  3. Заобиколно решение за MySQL ограничен диапазон TIMESTAMP?

  4. Клауза WHERE преди INNER JOIN

  5. Как мога да се отърва от тези коментари в MySQL дъмп?