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)