Bạn có thể tạo một kiểu tùy chỉnh bằng cách subclassing sqlalchemy.types.TypeDecorator
để xử lý serialization và deserialization sang văn bản.
An thực hiện có thể trông như
import json
import sqlalchemy
from sqlalchemy.types import TypeDecorator
SIZE = 256
class TextPickleType(TypeDecorator):
impl = sqlalchemy.Text(SIZE)
def process_bind_param(self, value, dialect):
if value is not None:
value = json.dumps(value)
return value
def process_result_value(self, value, dialect):
if value is not None:
value = json.loads(value)
return value
sử dụng Ví dụ:
class SomeModel(Base):
__tablename__ = 'the_table'
id = Column(Integer, primary_key=True)
json_field = Column(TextPickleType())
s = SomeEntity(json_field={'baked': 'beans', 'spam': 'ham'})
session.add(s)
session.commit()
này được nêu trong an example in the SQLAlchemy docs, mà cũng cho thấy làm thế nào để theo dõi những đột biến của từ điển đó.
Cách tiếp cận này sẽ làm việc cho tất cả các phiên bản của Python, trong khi chỉ đơn giản là đi json
như giá trị cho pickler
đối số của PickleType
sẽ không hoạt động chính xác, như AlexGrönholm points out trong bình luận của ông về câu trả lời khác.
Câu trả lời của bạn chưa hoàn chỉnh, vì vậy không thể chấp nhận. Nó cũng có tham chiếu đến "câu trả lời được chấp nhận" làm lệch hướng mọi nỗ lực và thay đổi trạng thái cụ thể đó trên bất kỳ câu trả lời nào. Vui lòng instad bắt đầu với một câu trả lời đúng, và (nếu bạn phải) bao gồm những gì người khác đã làm sai ở cuối. –
@ JonasByström đủ công bằng, tôi đã xóa tham chiếu đến câu trả lời hiện được chấp nhận và mở rộng ví dụ một chút – karlson
Điều này đã hiệu quả khi tôi thiết lập lần đầu tiên. Tuy nhiên sau khi thêm một trường mới vào mô hình của tôi ('product_count = db.Column (db.Integer)') nó cho tôi lỗi sau khi di chuyển các thay đổi sang mysql: 'NameError: name 'TextPickleType' không được định nghĩa' – iamlolz