सिर्फ चुनिंदा और इंसर्ट के लिए
ठीक है, चयन के लिए आप उपयोग कर सकते हैं:
>>> 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)
अतिरिक्त:कस्टम कॉलम जो पायथन प्रकारों का उपयोग करके डेटा को परिवर्तित करता है
हो सकता है कि आप कुछ सुंदर कस्टम प्रकार . का उपयोग करना चाहें और इसे अजगर और डेटाबेस के बीच कनवर्ट करना चाहते हैं।
निम्नलिखित उदाहरण में मैं यूयूआईडी को अजगर और डेटाबेस के बीच परिवर्तित करता हूं (कोड इस पर आधारित है लिंक ):
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)