SQLAlchemy (psycopg2.ProgrammingError) не может адаптировать тип 'dict' - PullRequest
0 голосов
/ 28 июня 2019

Не могу найти решение в сети для моей проблемы.Я пытаюсь вставить эту pandas df в таблицу Postgresql, используя SQLAlchemy

  • Pandas 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')

enter image description here

Когда я пытаюсь загрузить эту таблицу в 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)

Я проверил тип этого столбца, но он (тип объекта) не отличается от других столбцов.Я также попытался преобразовать его в строку и получил кучу других ошибок.Я считаю, что должно быть простое решение, которое я не могу понять.

1 Ответ

0 голосов
/ 28 июня 2019

Для меня лучшим способом будет разбить этот список на отдельные столбцы.Однако, если вы хотите добавить столбец ставки в таблицу SQL, вам необходимо преобразовать его.Вы написали, что это объект, но это список с диктовками.Ниже приведен код, как преобразовать его в строку:

df['bets'] = list(map(lambda x: json.dumps(x), df['bets']))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...