【问题标题】:How do i add a list of dicts to my sqlite database via sqlAlchemy?如何通过 sqlAlchemy 将字典列表添加到我的 sqlite 数据库?
【发布时间】:2021-07-14 03:31:18
【问题描述】:

案例: 我有一个生成器,它可以生成 som 密钥以及密钥 ID 和客户名称。

生成器输出一个字典列表,如下所示:

{'project': 'asdfasdfgg', 'key_id': 2, 'key': 't0n8x0RCAwKJ'}
{'project': 'asdfasdfgg', 'key_id': 3, 'key': 'FvBCCg@p4u4m'}
{'project': 'asdfasdfgg', 'key_id': 4, 'key': 'pjiNONS9H9jS'}
{'project': 'asdfasdfgg', 'key_id': 5, 'key': 'gpf4uUO97rgG'}
{'project': 'asdfasdfgg', 'key_id': 6, 'key': 'U999n89Fgbdj'}
{'project': 'asdfasdfgg', 'key_id': 7, 'key': '1eHBuMQ8GTrE'}

我想将此字典添加到我的数据库中,我的代码如下: main.py:


    class Keys(Base):
      __tablename__ = "keys"

      id = Column(Integer, primary_key=True)
      project = Column(String)
      key_id = Column(Integer)
      key = Column(String)



    def create_key(request: Request, project: str = Form(...), amount: int = Form(...), db: Session = 
    Depends(get_db)):

    keys = Keys()
    data_generated = streamticket.thekeygenerator.keydata.generator(amount, project)

    for d in data_generated:
        keys.project = i["project"]
        keys.key = i["key"]
        keys.key_id = i["key_id"]

        db.add(keys)
    db.commit()


我的问题是这只是添加到数据库中的最后一个字典/键。我的逻辑是它更新了键类,数据库刚刚更新,并且不为 for 循环中的每个 dict 创建一个新行。 我已经阅读了文档并添加了可以使用 db.add_all 的多个项目,但我不明白如何使用这是我的情况,因为我只是在每个周期中更新密钥模型..

请对我好,这是我的第一个python项目:-)

【问题讨论】:

  • 我看不到变量i 的创建位置。您的 for 循环会创建一个名为 d 的变量。这是您的实际代码吗?
  • @mechanical_meat 对不起.. 帖子应该说 'i' insted of 'd' 我在堆栈溢出时将其更改为 'd'。所以这不是问题......

标签: python sqlite sqlalchemy fastapi


【解决方案1】:

您需要为每次调用db.add() 创建一个新的Keys() 实例。

所以,它变成:

data_generated = streamticket.thekeygenerator.keydata.generator(amount, project)

for d in data_generated:
    keys = Keys()
    keys.project = d["project"]
    keys.key = d["key"]
    keys.key_id = d["key_id"]
    db.add(keys)

db.commit()

这是因为 db.add 需要一个唯一的 Keys 实例。创建单个 Keys 实例会在每次迭代时重写它,因此只插入最后一个值。另请参阅 herehere

我的意思是独一无二的-

class Person:
    pass

p1 = Person()
p2 = Person()

print(p1 == p1, p2 == p2)  # True True
print(p1 == p2)  # False

【讨论】:

  • 谢谢@roshnet!
  • 你能解释一下为什么我必须在每个周期中定义它吗?
猜你喜欢
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2012-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多