SQLAlchemy(psycopg2.ProgrammingError)无法适应类型'dict'

Posted

技术标签:

【中文标题】SQLAlchemy(psycopg2.ProgrammingError)无法适应类型\'dict\'【英文标题】:SQLAlchemy (psycopg2.ProgrammingError) can't adapt type 'dict'SQLAlchemy(psycopg2.ProgrammingError)无法适应类型'dict' 【发布时间】:2019-11-10 12:02:55 【问题描述】:

在网络上找不到我的问题的解决方案。 我正在尝试使用 SQLAlchemy 将此 pandas df 插入到 Postgresql 表中

熊猫 0.24.2 sqlalchemy 1.3.3 python 3.7

我的代码的相关部分如下:

engine = create_engine('postgresql://user:pass@host:5432/db')

file = open('GameRoundMessageBlackjackSample.json', 'r', encoding='utf-8')
json_dict = json.load(file)
df = json_normalize(json_dict, record_path='cards', meta=['bet', 'dealerId', 'dealerName', 'gameOutcome', 'gameRoundDuration', 'gameRoundId', 'gameType', 'tableId', 'win'])
df = df[['win', 'betAmount', 'bets']]

df.to_sql('test_netent_data', engine, if_exists='append')

当我尝试将此表加载到没有“投注”列的 sql 时,一切都按预期工作。但是当我包含它时,我收到以下错误:

sqlalchemy.exc.ProgrammingError: (psycopg2.ProgrammingError) can't adapt 
type 'dict'
[SQL: INSERT INTO test_netent_data (index, win, "betAmount", bets) VALUES (%(index)s, %(win)s, %(betAmount)s, %(bets)s)]
[parameters: ('index': 0, 'win': '2000.00', 'betAmount': '1212112', 'bets': ['name': '1', 'amount': '1212112'], 'index': 1, 'win': '2000.00', 'betAmount': '1212000', 'bets': ['name': '1', 'amount': '1212000'], 'index': 2, 'win': '2000.00', 'betAmount': '1212112', 'bets': ['name': '1', 'amount': '1212112'], 'index': 3, 'win': '2000.00', 'betAmount': '1212000', 'bets': ['name': '1', 'amount': '1212000'], 'index': 4, 'win': '2000.00', 'betAmount': '1212112', 'bets': ['name': '1', 'amount': '1212112'], 'index': 5, 'win': '2000.00', 'betAmount': '1212000', 'bets': ['name': '1', 'amount': '1212000'], 'index': 6, 'win': '2000.00', 'betAmount': '1212112', 'bets': ['name': '1', 'amount': '1212112'], 'index': 7, 'win': '2000.00', 'betAmount': '1212000', 'bets': ['name': '1', 'amount': '1212000'])]
(Background on this error at: http://sqlalche.me/e/f405)

我已经检查了该列的类型,但它(类型对象)与其他列没有什么不同。我还尝试将其转换为字符串并得到一堆其他错误。 我相信应该有一个我无法理解的简单解决方案。

【问题讨论】:

postgres 中的 bets 列是什么类型的? 感谢您的回复。 print(df.dtypes) 显示:win -> object,betAmount -> object,bets -> object。我本可以完全展平 json,但我想避免它并保持一些数据看起来像 json 字符串或 python dict 不,不是在 python 中,而是在 postgres 中。 test_netent_data表的定义是什么? 所有的列都是'text' 【参考方案1】:

对我来说,更好的方法是将此列表字典解析为单独的列。但是,如果要将列 bets 添加到 SQL 表中,则需要对其进行转换。您写道这是对象,但它是带有字典的列表。下面是如何将其转换为字符串的代码:

df['bets'] = list(map(lambda x: json.dumps(x), df['bets']))

【讨论】:

【参考方案2】:

只需使用数据框应用

df['bets'] = df['bets'].apply(json.dumps)

【讨论】:

以上是关于SQLAlchemy(psycopg2.ProgrammingError)无法适应类型'dict'的主要内容,如果未能解决你的问题,请参考以下文章

flask-sqlalchemy

sqlalchemy.exc.NoSuchModuleError:无法加载插件:sqlalchemy.dialects:postgres

SQLAlchemy 是不是从同一连接重置 SQLAlchemy 会话之间的数据库会话?

SQLAlchemy使用笔记--SQLAlchemy ORM

SQLAlchemy -- Python的SQLAlchemy和ORM

SQLAlchemy(一):SQLAlchemy去连接数据库ORM介绍将ORM模型映射到数据库中