Ale*_* Ka 6 postgresql json sqlalchemy python-3.x pandas
无法在网上找到解决我的问题的方法。我正在尝试使用 SQLAlchemy 将此 Pandas df 插入到 Postgresql 表中
我的代码的相关部分如下:
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')
Run Code Online (Sandbox Code Playgroud)
当我尝试将此表加载到 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)
Run Code Online (Sandbox Code Playgroud)
我已经检查过此列的类型,但它(类型对象)与其他列没有区别。我还尝试将其转换为字符串并遇到了许多其他错误。我相信应该有一个我无法理解的简单解决方案。
ast*_*nlu 14
由于您正在使用pandas.DataFrame.to_sql,更好的选择是利用本机JSON类型:
df.to_sql(
'test_netent_data',
engine,
if_exists='append',
dtype={"bets": sqlalchemy.types.JSON},
)
Run Code Online (Sandbox Code Playgroud)
(灵感来自/sf/answers/2902860201/)
小智 13
对我来说,更好的方法是将这个列表字典解析为单独的列。但是,如果您想将列投注添加到 SQL 表中,则需要对其进行转换。您写道这是对象,但它是带有字典的列表。下面是如何将其转换为字符串的代码:
df['bets'] = list(map(lambda x: json.dumps(x), df['bets']))
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14715 次 |
| 最近记录: |