为了账号安全,请及时绑定邮箱和手机立即绑定

psycopg2 将行作为列插入

psycopg2 将行作为列插入

扬帆大鱼 2023-12-12 14:54:44
我不确定我是否正确地表达了这一点,但是当从一个数据库查询数据并将其插入另一个数据库时psycopg2,在某些时候脚本会分解数据,并将行作为列插入(即每个数据库打印一个字符)每行列)如下:     name     | id_2       | id_1        | blank        | data--------------+------------+-------------+--------------+-------------- A            | 1          | a           |              | {json: data} B            | a          | 1           |              | {json: data} C            | 2          | b           |              | {json: data} D            | b          | 2           |              | {json: data} E            | 3          | c           |              | {json: data} F            | c          | 3           |              | {json: data}我希望表格如下所示:     name     | id_2       | id_1        | blank        | data--------------+------------+-------------+--------------+-------------- ABCDEF       | 1a2b3c     | a1b2c3      |              | {json: data}我必须生成的代码是:import psycopg2, uuidid_1 = str(uuid.uuid4())conn1 = psycopg2.connect(    host='host',    database=db1,    user='user',    password='password')conn2 = psycopg2.connect(    host='host',    database=db2    user='user',    password='password')def generate_data(id_1, name, id_2):    data = {        "tag": name,        "id_2": id_2,        "id_1": id_1,        "rand_int": random.randint(0, 86400),        "rand_uni_1": str(round(random.uniform(0.0, 8.0), 2)),        "rand_uni_2": str(round(random.uniform(0.0, 16.0), 2)),        "digi": "",        "point_type": random.randint(0, 1),        "garbage_data": "garbage_data"    }    data_str = str(json.dumps(data).replace("'", "''"))    add_data(name, id_2, id_1, data_str)我使用 print 语句来验证数据是否显示为应插入表中。我在隔离与此代码相关的另一个问题时发现了这一点jsonb,我将在接下来发布该问题。我对 SQL 和 Python(以及 psycopg2)比较陌生,因为我来自 QA,所以非常感谢任何帮助!
查看完整描述

1 回答

?
繁星淼淼

TA贡献1775条经验 获得超11个赞

今天早上站会后,我联系了我们的一些开发人员,并解决了这个问题,如果不清楚的话,这就是数据如何输入数据库的方式,如上所述。


这里的问题在于线路cur.executemany(insert_data, zip(name_rec, id_2_rec, id_1_rec, data_rec))- 更具体地说是executemany方法和zip()功能。由于该zip()函数返回一个 zip 对象,它是一个元组迭代器,其中每个传递的迭代器中的第一项(以及所有后续项)都配对在一起,并且该executemany方法准备数据库操作(查询或命令)并针对所有参数执行它在序列 seq_of_params 中找到的序列或映射,这导致数据逐个字符地输入到新表中。通过将行更改为来解决此问题,cur.execute(insert_data, (name_rec, id_2_rec, id_1_rec, data_rec))现在我的数据按应有的方式显示,即


     name     | id_2       | id_1        | blank        | data

--------------+------------+-------------+--------------+--------------

 ABCDEF       | 1a2b3c     | a1b2c3      |              | {json:data}

对于混乱的代码,我深表歉意,如果我最初没有正确地阐明这个问题——我在音乐学校上学,大约 2.5 年前作为 QA 进入这个领域,没有任何经验,所以这对我来说仍然是相对较新的。


查看完整回答
反对 回复 2023-12-12
  • 1 回答
  • 0 关注
  • 98 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信