小编shr*_*oud的帖子

在分配子关系时避免在刷新后选择

我有以下SQLAlchemy模型:

class Parent(Base):
    id = Column(Integer, primary_key=True)

class Child(Base):
    id = Column(Integer, primary_key=True)
    title = Column(String, nullable=False)
    parent_id = Column(Integer, ForeignKey(Parent.id), nullable=False)

    parent = relationship(Parent, 
                          backref=backref('children',
                                          order_by=id,
                                          cascade='all, delete-orphan'))
Run Code Online (Sandbox Code Playgroud)

然后我想创建一个父母和一些孩子,所有这些都在同一个声明中:

p = Parent()
DBSession.add(p)

# some unrelated code runs which triggers a flush

p.children = [Child(title=title) for title in titles]
Run Code Online (Sandbox Code Playgroud)

p.children =赋值语句触发了一个不需要的SELECT语句,因为SQLAlchemy必须清除任何Child指向该语句的预先存在的对象Parent.我意识到我可以SELECT使用lazy='noload'backref上的选项消除语句,但我需要这种关系在其他上下文中正常运行(即从DB获取结果).

有没有办法我可以创建一个返回noload关系值的属性,如果已经设置,并使用常规关系从DB加载结果?或者我是否正在以正确的方式思考这个问题?

python sqlalchemy

6
推荐指数
1
解决办法
151
查看次数

使用sqlalchemy仅从相关表中选择一行

假设我有一个Author表和一个Post表,每个作者可以有几个帖子.

现在,通过单个 sqlalchemy查询,我想获得所有活跃的作者和每个最新发布的帖子.

我一直试图通过获取加载作者的帖子列表,使用子查询将结果组合在一起,如下所示:

subquery = DBSession.query(Author.id, func.max(Post.publish_date).label("publish_date")) \
    .join(Post.author) \
    .filter(Post.state == 'published') \
    .filter(Author.state == 'active') \
    .group_by(Author.id) \
    .subquery()

query = DBSession.query(Post) \
    .options(joinedload(Post.author)) \
    .join(Post.author) \
    .join(subquery, and_(Author.id == subquery.c.id, 
                         Post.publish_date == subquery.c.publish_date))
Run Code Online (Sandbox Code Playgroud)

但是,如果我有一个来自具有相同publish_date的作者的两个帖子,并且这些是最新的帖子,那意味着我将该作者在我的结果列表中出现两次.虽然我可以使用第二个子查询来消除欺骗(使用func.max(Post.id)),但这似乎真的是非常错误的方法.有没有更好的方法来解决这个问题?

(同样,我正在寻找一个单一的查询,所以我试图避免查询作者表,然后循环并对我的结果中的每个作者进行Post查询.)

python sqlalchemy

5
推荐指数
1
解决办法
3115
查看次数

尝试在 Python 中制作 JSON Schema 验证器以设置默认值

我正在使用JSON Schema FAQ 中代码的稍微修改版本来创建一个设置默认值的验证器:

def extend_with_default(validator_class):
    validate_properties = validator_class.VALIDATORS["properties"]

    def set_defaults(validator, properties, instance, schema):
        for property_, subschema in properties.items():
            if "default" in subschema:
                instance.setdefault(property_, subschema["default"])

        for error in validate_properties(
            validator, properties, instance, schema,
        ):
            yield error

    return validators.extend(
        validator_class, {"properties": set_defaults},
    )
DefaultValidatingDraft4Validator = extend_with_default(Draft4Validator)
Run Code Online (Sandbox Code Playgroud)

我有一个像这样的 JSON 模式:

{'definitions': {
  'obj': {'additionalProperties': False,
          'properties': {
            'foo': {'default': None, 'oneOf': [{'type': 'null'}, {'type': 'string'}]},
            'bar': {'default': None, 'oneOf': [{'type': 'null'}, {'type': 'string'}]},
            'baz': {'default': None, 'oneOf': [{'type': 'null'}, {'type': …
Run Code Online (Sandbox Code Playgroud)

python jsonschema

5
推荐指数
1
解决办法
3228
查看次数

Alembic 无法创建复合唯一索引

我有以下模型:

class Table(Base):
    __tablename__ = 'table'
    __table_args__ = (
        Index('bar_baz_idx', 'bar', 'baz', unique=True,
              postgresql_where='foo IS NULL AND bar IS NOT NULL '
                               'AND baz IS NOT NULL'),
        {'schema': 'custom_schema'},
    )

    foo = Column(String(80), nullable=True)
    bar = Column(String(80), nullable=True)
    baz = Column(String(80), nullable=True)
Run Code Online (Sandbox Code Playgroud)

当我自动生成 Alembic 迁移时,它会产生以下升级功能:

def upgrade():
    # ### commands auto generated by Alembic - please adjust! ###
    op.create_table('table',
    sa.Column('foo', sa.String(length=80), nullable=True),
    sa.Column('bar', sa.String(length=80), nullable=True),
    sa.Column('baz', sa.String(length=80), nullable=True),
    sa.Column('fxt', sa.String(), nullable=True),
    sa.Column('id', sa.Integer(), nullable=False),
    sa.PrimaryKeyConstraint('id'),
    schema='custom_schema'
    )
    op.create_index('bar_baz_idx', 'table', ['bar', …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy alembic

5
推荐指数
0
解决办法
1235
查看次数

为什么我看不到Raphael.js饼图演示中的颜色?

我在http://jsfiddle.net/s6dEW/复制了拉斐尔饼图演示:

Raphael.fn.pieChart = function (cx, cy, r, values, labels, stroke) {
    var paper = this,
        rad = Math.PI / 180,
        chart = this.set();

    function sector(cx, cy, r, startAngle, endAngle, params) {
        var x1 = cx + r * Math.cos(-startAngle * rad),
            x2 = cx + r * Math.cos(-endAngle * rad),
            y1 = cy + r * Math.sin(-startAngle * rad),
            y2 = cy + r * Math.sin(-endAngle * rad);
        return paper.path(["M", cx, cy, "L", x1, y1, "A", r, r, …
Run Code Online (Sandbox Code Playgroud)

javascript raphael

4
推荐指数
1
解决办法
465
查看次数

标签 统计

python ×4

sqlalchemy ×3

alembic ×1

javascript ×1

jsonschema ×1

raphael ×1