Mysql
 sql >> डेटाबेस >  >> RDS >> Mysql

पायथन-स्क्लेल्केमी बाइनरी कॉलम प्रकार हेक्स () और यूएनएचईएक्स ()

सिर्फ चुनिंदा और इंसर्ट के लिए

ठीक है, चयन के लिए आप उपयोग कर सकते हैं:

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


  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 डेटाबेस में संग्रहीत करें

  2. संबंध से सबसे सामान्य मान का चयन करना - SQL कथन

  3. डेटाबेस में रिकॉर्ड को ऑटो अपडेट कैसे करें?

  4. दास पढ़ें, मास्टर सेटअप पढ़ें-लिखें

  5. PHP सरणी mysql प्रत्येक रिकॉर्ड को पुनः प्राप्त करता है