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)