Chỉ cho phần được chọn và phần chèn
Chà, bạn có thể sử dụng để chọn:
>>> 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(?)
Đối với chèn:
>>> 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))
Một cách tiếp cận tốt hơn:Cột tùy chỉnh chuyển đổi dữ liệu bằng cách sử dụng các hàm sql
Tuy nhiên, tôi nghĩ điều tốt nhất cho bạn là tùy chỉnh cột về sqlalchemy
sử dụng bất kỳ process_bind_param
, process_result_value
, bind_expression
và column_expression
xem ví dụ này"> .
Kiểm tra mã này bên dưới, nó tạo ra một cột tùy chỉnh mà tôi nghĩ phù hợp với nhu cầu của bạn:
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)
Bạn có thể lập mô hình bảng của mình như:
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
Một số cách sử dụng:
>>> (...)
>>> session = create_session(...)
>>> (...)
>>> model = Model(col='Iuri Diniz')
>>> session.add(model)
>>> session.commit()
vấn đề này gây ra truy vấn này:
INSERT INTO model (col) VALUES (HEX(?)); -- ('Iuri Diniz',)
Sử dụng nhiều hơn:
>>> session.query(Model).first()
Model(col='Iuri Diniz')
vấn đề này gây ra truy vấn này:
SELECT
model.id AS model_id, UNHEX(model.col) AS model_col
FROM model
LIMIT ? ; -- (1,)
Thêm một chút:
>>> session.query(Model).filter(Model.col == "Iuri Diniz").first()
Model(col='Iuri Diniz')
vấn đề này gây ra truy vấn này:
SELECT
model.id AS model_id, UNHEX(model.col) AS model_col
FROM model
WHERE model.col = HEX(?)
LIMIT ? ; -- ('Iuri Diniz', 1)
Thêm:Cột tùy chỉnh chuyển đổi dữ liệu bằng cách sử dụng các loại python
Có thể bạn muốn sử dụng một số loại tùy chỉnh đẹp mắt và muốn chuyển đổi nó giữa python và cơ sở dữ liệu.
Trong ví dụ sau, tôi chuyển đổi UUID giữa python và cơ sở dữ liệu (mã dựa trên điều này liên kết ):
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)