我有一个看起来像的模式
Column | Type |
-------------------------------------------------------
message_id | integer |
user_id | integer |
body | text |
created_at | timestamp without time zone |
source | jsonb |
symbols | jsonb[] |
我正在尝试使用 psycopg2 通过 psycopg2.Cursor.copy_from() 插入数据,但我遇到了很多问题,试图弄清楚应该如何格式化 jsonb[] 对象。当我做一个 JSON 对象的直接列表时,我得到一个错误,看起来像
psycopg2.errors.InvalidTextRepresentation: malformed array literal: "[{'id': 13016, 'symbol':
....
DETAIL: "[" must introduce explicitly-specified array dimensions.
我在双引号和大括号上尝试过许多不同的转义。如果我对我的数据执行 json.dumps(),我会收到以下错误。
psycopg2.errors.InvalidTextRepresentation: invalid input syntax for type json
DETAIL: Token "'" is invalid.
从此代码段收到此错误
messageData = []
symbols = messageObject["symbols"]
newSymbols = []
for symbol in symbols:
toAppend = symbol
toAppend = refineJSON(json.dumps(symbol))
toAppend = re.sub("{", "\{", toAppend)
toAppend = re.sub("}", "\}", toAppend)
toAppend = re.sub('"', '\\"', toAppend)
newSymbols.append(toAppend)
messageData.append(set(newSymbols))
我也愿意将列定义为不同的类型(例如,文本),然后尝试进行转换,但我也无法做到这一点。
messageData 是调用 psycopg2.Cursor.copy_from() 的辅助函数的输入
def copy_string_iterator_messages(connection, messages, size: int = 8192) -> None:
with connection.cursor() as cursor:
messages_string_iterator = StringIteratorIO((
'|'.join(map(clean_csv_value, (messageData[0], messageData[1], messageData[2], messageData[3], messageData[4], messageData[5], messageData[6], messageData[7], messageData[8], messageData[9], messageData[10],
messageData[11],
))) + '\n'
for messageData in messages
))
# pp.pprint(messages_string_iterator.read())
cursor.copy_from(messages_string_iterator, 'test', sep='|', size=size)
connection.commit()
三国纷争
相关分类