gpt4 book ai didi

mysql - Python-Sqlalchemy 二进制列类型 HEX() 和 UNHEX()

转载 作者:行者123 更新时间:2023-11-29 01:09:48 24 4
gpt4 key购买 nike

我正在尝试学习 Sqlalchemy 并使用 ORM。我的专栏之一将文件哈希存储为二进制文件。在 SQL 中,选择只是

SELECT 类型,列 FROM table WHERE hash = UNHEX('somehash')

如何使用我的 ORM 实现这样的选择(最好也使用插入示例)?我已经开始阅读有关列覆盖的内容,但我很困惑/不确定这是否真的是我所追求的。

例如res = session.query.filter(Model.hash == __something__?)

想法?

最佳答案

仅适用于选择和插入

好吧,对于 select 你可以使用:

>>> 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 column on sqlalchemy使用任何 process_bind_param , process_result_value , bind_expressioncolumn_expression看这个example .

检查下面的代码,它创建了一个我认为适合您需要的自定义列:

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(代码基于此 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)

关于mysql - Python-Sqlalchemy 二进制列类型 HEX() 和 UNHEX(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33923914/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com