psycopg2 将行作为列插入

我不确定我是否正确地表达了这一点,但是当从一个数据库查询数据并将其插入另一个数据库时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, uuid


id_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,所以非常感谢任何帮助!


扬帆大鱼
浏览 99回答 1
1回答

繁星淼淼

今天早上站会后,我联系了我们的一些开发人员,并解决了这个问题,如果不清楚的话,这就是数据如何输入数据库的方式,如上所述。这里的问题在于线路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 进入这个领域,没有任何经验,所以这对我来说仍然是相对较新的。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python