小编Ben*_*uch的帖子

为什么 SQLAlchemy 关联对象中的外键被标记为主键?

以下是sqlalchemy的文档。

注意关联类中的left_id和right_id是如何先标记为ForeignKey然后primary_key = True

对我来说,它们应该是外键是有道理的,因为从逻辑上讲,它们是其他两个父表和子表的外键。

那么让它们成为主键的目的是什么?

这里发生了什么?请解释。

class Association(Base):
    __tablename__ = 'association'
    left_id = Column(Integer, ForeignKey('left.id'), primary_key=True)
    right_id = Column(Integer, ForeignKey('right.id'), primary_key=True)
    extra_data = Column(String(50))
    child = relationship("Child", back_populates="parents")
    parent = relationship("Parent", back_populates="children")

class Parent(Base):
    __tablename__ = 'left'
    id = Column(Integer, primary_key=True)
    children = relationship("Association", back_populates="parent")

class Child(Base):
    __tablename__ = 'right'
    id = Column(Integer, primary_key=True)
    parents = relationship("Association", back_populates="child")
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

3
推荐指数
1
解决办法
873
查看次数

为什么此生成器(使用递归)无法产生直观的结果

我编写了一个简单的生成器函数,该函数接受一个可能包含子列表的列表,并尝试展平该列表:

因此[1,[2,3],4,[5,[6,7],8]]应产生1,2,3,4,5,6,7,8

如果我只想打印出值(而不是生成器),它看起来像这样,这可行:

#  Code A
def flatten_list_of_lists(my_list):
    for element in my_list:
        if isinstance(element, list):
            flatten_list_of_lists(element)
        else:
            print(element)

my_list = [1, [2, 3], 4, [5, [6, 7], 8]]
flatten_list_of_lists(my_list)
Run Code Online (Sandbox Code Playgroud)

并按预期打印出1,2,3,4,5,6,7,8

但是,当我将代码更改为此:

#  Code B
def flatten_list_of_lists(my_list):
    for element in my_list:
        if isinstance(element, list):
            flatten_list_of_lists(element)
        else:
            yield element

for i in flatten_list_of_lists(my_list):
    print(i)
Run Code Online (Sandbox Code Playgroud)

只是将打印转换为成品,程序仅打印出1,4。

我将在下面粘贴有效的代码。但是我想知道为什么以前的代码不起作用?如果代码A正确地“打印”了数字,为什么代码B不能正确地“屈服”数字呢?

似乎我对生成器如何使用递归有基本的误解。

该代码实际上有效:

#  Code C
def flatten_list_of_lists_v2(my_list):
    for element in my_list:
        if isinstance(element, list):
            for sub_element in flatten_list_of_lists_v2(element):
                yield sub_element
        else:
            yield element

l = [] …
Run Code Online (Sandbox Code Playgroud)

python recursion generator

0
推荐指数
1
解决办法
40
查看次数