You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用Python从数据库读取数据并写入另一张表?附代码解析

如何用Python(psycopg2)实现PostgreSQL数据的跨表迁移

咱先明确核心需求:从PostgreSQL的一张表读取数据,再将数据写入另一张表。下面基于psycopg2库拆解实现步骤,顺便修正原代码里的小细节问题。

前置准备

首先得确保安装了psycopg2库,直接用pip安装即可:

pip install psycopg2-binary

另外要提前定义好数据库连接的配置变量(替换成你的实际信息):

DATABASE = "your_db_name"
USER = "your_username"
PASSWD = "your_password"
HOST = "your_host"
PORT = "your_port"

1. 读取数据的函数(补全原代码)

原代码里的read_locations没写完,咱把它补全,用来从源表(比如叫account_locations)读取所有location数据:

import psycopg2

def read_locations():
    # 建立数据库连接
    db = psycopg2.connect(database=DATABASE, user=USER, password=PASSWD, host=HOST, port=PORT)
    cursor = db.cursor()
    
    # 执行查询语句,从源表拉取数据
    select_query = "SELECT location FROM account_locations;"
    cursor.execute(select_query)
    
    # 获取所有查询结果(返回的是元组列表)
    locations = cursor.fetchall()
    
    # 关闭游标和连接,避免资源泄漏
    cursor.close()
    db.close()
    
    # 把结果整理成单个值的列表,方便后续写入
    return [loc[0] for loc in locations]

2. 写入数据的函数(修正原代码的小坑)

原代码里有个容易踩的小问题:cursor.execute(insert_query, (location))里的(location)不是元组,Python会把它当成普通括号解析,传递的是单个值,而psycopg2需要接收序列类型(元组或列表),所以要改成(location,)。咱也给代码加了注释说明逻辑:

def store_locations(location):
    # 建立数据库连接
    db = psycopg2.connect(database=DATABASE, user=USER, password=PASSWD, host=HOST, port=PORT)
    cursor = db.cursor()
    
    # 构造Upsert语句:如果location已存在就更新,不存在则插入
    insert_query = """
        INSERT INTO account_locations2(location) 
        VALUES (%s) 
        ON CONFLICT (location) DO UPDATE SET location=EXCLUDED.location
    """
    # 注意:单个元素的元组要加逗号,避免被解析成单个值
    cursor.execute(insert_query, (location,))
    
    # 必须提交事务,否则数据不会真正写入数据库
    db.commit()
    
    # 关闭游标和连接
    cursor.close()
    db.close()

3. 整合调用完整流程

最后把两个函数结合起来,实现从源表读取、目标表写入的完整迁移:

if __name__ == "__main__":
    # 读取所有location数据
    location_list = read_locations()
    
    # 遍历写入目标表
    for loc in location_list:
        store_locations(loc)
    print("数据迁移完成!")

关键细节说明

  • Upsert逻辑:ON CONFLICT (location) DO UPDATE是PostgreSQL的特性,用来处理重复数据,避免因唯一键冲突导致写入失败。EXCLUDED指的是本次要插入的那条数据。
  • 连接优化:每次函数调用都新建/关闭连接,适合小数据量场景;如果数据量很大,建议用psycopg2.pool连接池提升效率。
  • 参数化查询:用%s做占位符,而非直接拼接SQL字符串,能有效防止SQL注入,这是psycopg2的最佳实践。

内容的提问来源于stack exchange,提问作者Hanwen Guo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 10:39:33