gpt4 book ai didi

python - 如何使用 SQLAlchemy 声明式制作复合列?

转载 作者:太空狗 更新时间:2023-10-30 02:49:09 26 4
gpt4 key购买 nike

我经常使用包含 Markdown 格式的富文本的 Text 列制作模型。我的模型看起来像这样:

class Document(Base):
id = Column(Integer, primary_key=True)
title = Column(Unicode(250))
description = Column(Text)
description_html = Column(Text)

我的编辑表单 (a) 读取并写入 description,然后 (b) 将 Markdown 格式的版本写入 description_html。我的 (Jinja2) View 模板 (c) 使用 {{ doc.description_html|safe }} 加载 HTML 版本。

我想将这三个重复操作缩减为一个列定义,如下所示:

class Document(Base):
id = Column(Integer, primary_key=True)
title = Column(Unicode(250))
description = Column(MarkdownText)

其中 MarkdownText 是一种新的列类型:

  1. 在数据库表中创建两列(description 和 description_html),
  2. 写入该列后,还将 Markdown 格式的版本写入 html 列,并且
  3. 提供一个返回 html 列内容的 __html__() 方法。这将允许它在 Jinja2 模板中用作 {{ doc.description }} 而无需 safe 过滤器。

问题:#1 可能吗?我可以定义一个包含两列的列吗?

最佳答案

开始吧 - 现在使用复合列:

from sqlalchemy import create_engine
from sqlalchemy import Column, Integer, Text
from sqlalchemy.orm import composite, sessionmaker
from sqlalchemy.ext.declarative import declarative_base

engine = create_engine('sqlite:///')
session = sessionmaker(bind=engine)()
Base = declarative_base()

class MarkdownText(object):

def __init__(self, text):
self._text = text
self._html = "<html>%s</html>" % text

@classmethod
def _from_db(cls, text, html):
mt = MarkdownText(text)
mt._html = html
return mt

def __composite_values__(self):
return (self._text, self._html)

def __str__(self):
return self._text

@property
def __html__(self):
return self._html

class Foo(Base):
__tablename__ = 'foo'

id = Column(Integer, primary_key=True)
a = composite(MarkdownText._from_db,
Column('_text', Text),
Column('_html', Text))

def __init__(self, a):
self.a = MarkdownText(a)

def __repr__(self):
return '(%s)' % (self.a)

Base.metadata.create_all(engine)

session.add_all([Foo('test'), Foo('nips')])
session.commit()
x = session.query(Foo).all()
print x
print x[0].a.__html__
print x[0].a

这给了我们很好的:

[(test), (nips)]
<html>test</html>
test

关于python - 如何使用 SQLAlchemy 声明式制作复合列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9565689/

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