Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Tipe Kolom Biner Python-Sqlalchemy HEX() dan UNHEX()

Hanya untuk pilihan dan sisipan

Nah, untuk memilih Anda bisa menggunakan:

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

Untuk sisipan:

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

Pendekatan yang lebih baik:Kolom khusus yang mengonversi data dengan menggunakan fungsi sql

Tapi, saya pikir yang terbaik untuk Anda adalah kustom kolom di sqlalchemy menggunakan process_bind_param , process_result_value , bind_expression dan column_expression lihat contoh .

Periksa kode di bawah ini, itu membuat kolom khusus yang menurut saya sesuai dengan kebutuhan Anda:

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)

Anda dapat membuat model tabel seperti:

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

Beberapa penggunaan:

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

ini mengeluarkan kueri ini:

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

Lebih banyak penggunaan:

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

ini mengeluarkan kueri ini:

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

Sedikit lagi:

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

ini mengeluarkan kueri ini:

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

Ekstra:Kolom khusus yang mengonversi data dengan menggunakan jenis python

Mungkin Anda ingin menggunakan beberapa jenis khusus yang cantik dan ingin mengonversinya antara python dan database.

Dalam contoh berikut saya mengonversi UUID antara python dan database (kode ini didasarkan pada tautan ):

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. tidak dapat terhubung ke database mysql di Ubuntu

  2. INSERT..RETURNING tidak berfungsi di JOOQ

  3. Urutan hasil berdasarkan data klausa WHERE IN

  4. Bagaimana menemukan data dari minggu lalu di MySQL

  5. Mengonversi Kumpulan Hasil MySQL dari Baris ke Kolom