geu*_*rik 2 mysql sqlalchemy python-2.7
我正在尝试学习Sqlalchemy并使用ORM.我的一个列将文件哈希存储为二进制.在SQL中,select就是
SELECT type, column 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(?)
Run Code Online (Sandbox Code Playgroud)
对于插入:
>>> 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))
Run Code Online (Sandbox Code Playgroud)
但是,我认为你最好的是在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)
Run Code Online (Sandbox Code Playgroud)
您可以为表格建模,如:
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
Run Code Online (Sandbox Code Playgroud)
一些用法:
>>> (...)
>>> session = create_session(...)
>>> (...)
>>> model = Model(col='Iuri Diniz')
>>> session.add(model)
>>> session.commit()
Run Code Online (Sandbox Code Playgroud)
这会发出此查询:
INSERT INTO model (col) VALUES (HEX(?)); -- ('Iuri Diniz',)
Run Code Online (Sandbox Code Playgroud)
更多用法:
>>> session.query(Model).first()
Model(col='Iuri Diniz')
Run Code Online (Sandbox Code Playgroud)
这会发出此查询:
SELECT
model.id AS model_id, UNHEX(model.col) AS model_col
FROM model
LIMIT ? ; -- (1,)
Run Code Online (Sandbox Code Playgroud)
多一点:
>>> session.query(Model).filter(Model.col == "Iuri Diniz").first()
Model(col='Iuri Diniz')
Run Code Online (Sandbox Code Playgroud)
这会发出此查询:
SELECT
model.id AS model_id, UNHEX(model.col) AS model_col
FROM model
WHERE model.col = HEX(?)
LIMIT ? ; -- ('Iuri Diniz', 1)
Run Code Online (Sandbox Code Playgroud)
也许你想使用一些漂亮的自定义类型,并希望在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)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
3335 次 |
最近记录: |