sql >> データベース >  >> RDS >> Mysql

Python-Sqlalchemyバイナリ列タイプHEX()およびUNHEX()

    選択と挿入のみ

    ええと、選択のためにあなたは使うことができます:

    >>> 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関数を使用してデータを変換するカスタム列

    しかし、あなたに最適なのは custom 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)
    

    追加:Pythonタイプを使用してデータを変換するカスタム列

    たぶんあなたはいくつかの美しいカスタムタイプを使いたいでしょう Pythonとデータベースの間で変換したい。

    次の例では、Pythonとデータベースの間でUUIDを変換します(コードはこのリンク ):

    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. Oracleで文字列内の単語数をカウントするにはどうすればよいですか?

    2. T-SQLを使用してデータベースの互換性レベルを変更する方法

    3. PHP-ログインシステムでメンバー専用ページを保護する

    4. 安全な接続を介したOracleのSQLServerへの接続