我有以下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加载结果?或者我是否正在以正确的方式思考这个问题?
假设我有一个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查询.)
我正在使用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) 我有以下模型:
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) 我在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)