如何使用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
相关产品推荐
相关产品推荐

