【问题标题】:Insert dictionary into Postgres via SQLAlchemy通过 SQLAlchemy 将字典插入 Postgres
【发布时间】:2023-03-26 12:39:01
【问题描述】:

我正在尝试通过 Python 中的 SQLAlchemy 将字典加载到 Postgres 数据库中。当前存在的字典是:

FinalData = {'GAME_ID': {0: '0021600457', 1: '0021600457', 2: '0021600457', 3: 
'0021600457', 4: '0021600457', 5: '0021600457'}, 'TEAM_ID': {0: 1610612744, 1: 
1610612744, 2: 1610612744, 3: 1610612744, 4: 1610612744, 5: 1610612744}, 
'TEAM_ABBREVIATION': {0: 'GSW', 1: 'GSW', 2: 'GSW', 3: 'GSW', 4: 'GSW', 5: 
'GSW'}}

我编写了以下代码(基于我在这里和在线找到的其他教程/问题)。如果我只插入 1 条记录,我就可以完成这项工作——因为我可以手动将属性分配给 PlayerStats。但是由于字典有多个记录,我不知道如何将它们全部传递到会话语句中。

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, Integer, String

Base = declarative_base()

class PlayerStats(Base):
    __tablename__ = 'PlayerStats'

    GAME_ID = Column(String(10), primary_key=True)
    TEAM_ID = Column(String(10))
    TEAM_ABBREVIATION = Column(String(8))

###################################################
## I DON'T KNOW WHAT GOES HERE TO BRIDGE THE GAP ##
###################################################

engine = create_engine('postgres://.........')
Base.metadata.create_all(engine)
Session = sessionmaker(bind=engine)
session = Session()
session.add(FinalData)  # I'M ASSUMING I NEED TO ITERATE OVER THIS #

我确定我遗漏了一些简单的东西,但是如何将 FinalData 字典的所有内容传递到 SQLAlchemy add 语句?

【问题讨论】:

    标签: python postgresql dictionary sqlalchemy


    【解决方案1】:

    您的 FinalData 结构由 3 个内部 dicts 组成,每个 dicts 由某个整数序列作为键,因此您必须通过为 subdicts 中的每个键创建一个新的 PlayerStats 对象来解压它。

    在下面的示例中,我使用FinalData['GAME_ID'] 内部字典的整数键来搜索其他两个字典中的值以填充剩余字段。

    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column, Integer, String
    
    Base = declarative_base()
    
    class PlayerStats(Base):
        __tablename__ = 'PlayerStats'
    
        GAME_ID = Column(String(10), primary_key=True)
        TEAM_ID = Column(String(10))
        TEAM_ABBREVIATION = Column(String(8))
    
    ###################################################
    FinalData = {'GAME_ID': {0: '0021600457', 1: '0021600457', 2: '0021600457', 3: 
    '0021600457', 4: '0021600457', 5: '0021600457'}, 'TEAM_ID': {0: 1610612744, 1: 
    1610612744, 2: 1610612744, 3: 1610612744, 4: 1610612744, 5: 1610612744}, 
    'TEAM_ABBREVIATION': {0: 'GSW', 1: 'GSW', 2: 'GSW', 3: 'GSW', 4: 'GSW', 5: 
    'GSW'}}
    ###################################################
    
    engine = create_engine('postgres://.........')
    Base.metadata.create_all(engine)
    Session = sessionmaker(bind=engine)
    session = Session()
    
    for key in FinalData['GAME_ID']:
        p = PlayerStats()
        p.GAME_ID = FinalData['GAME_ID'][key]
        p.TEAM_ID = FinalData['TEAM_ID'].get(key)
        p.TEAM_ABBREVIATION = FinalData['TEAM_ABBREVIATION'].get(key)
        session.add(p)
    
    session.commit()
    

    【讨论】:

    • 太棒了。谢谢!!就最佳实践而言,将内部字典解包并将其翻译成 1 个大字典是否更有意义?如果是这样,是否有正确的流程来执行此操作?
    • @GeorgeRodman 不,我认为您不必在处理字典之前对其进行转换,除非您是生成字典的人并且可以以不同的方式生成它。否则就按原样接受它,并将其直接转换为数据库对象,如上所示。中间结构只会增加混乱。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 2011-08-26
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多