在psycopg2 / postgres命令中使用外部变量

时间:2018-12-14 23:53:32

标签: python postgresql psycopg2

我有成千上万个相关的CSV,我想将它们的内容写到Postgres表中,其中包括有关每行来自何处​​的元数据。

我不清楚如何将在脚本顶部附近创建的变量写入表中。

有人可以建议吗?

target_directory = Path(sys.argv[1]).resolve()

# FOR THE WAC AND RAC DATASETS
for file in target_directory.rglob('*.csv'):
    print(str(file.stem).split('_'))

    state = str(file.stem).split('_')[0]
    data_category = str(file.stem).split('_')[1]
    workforce_segment = str(file.stem).split('_')[2] # THIS IS DIFFERENT FROM THE O-D DATASETS
    job_type = str(file.stem).split('_')[3]
    year = str(file.stem).split('_')[4]


    print('Writing: ' + str(file.name))

    # MAKE SURE THIS IS THE RIGHT TABLE FOR THE FILES
    cur.execute(create_table_WAC)

    with open(file,'r') as file_in:

        # INSERT THE DATA IN USING THE COLUMN NAMES....SO YOU CAN ADD YOUR SPLIT STRING INFO ABOVE.....
        # MAKE SURE THIS HAS THE RIGHT TABLE NAME IN THE COPY STATEMENT
        cur.execute("INSERT INTO opendata_uscensus_usa_lodes_wac (serial_id, state_name, data_category, workforce_segment, job_type, year, w_geocode, C000, CA01, CA02, CA03, CE01, CE02) \
        VALUES (%s, state_name, data_category, workforce_segment, job_type, year, %s, %s, %s, %s, %s, %s)")

        conn.commit()

conn.close()

1 个答案:

答案 0 :(得分:1)

根据大多数DB-API坚持遵守的PEP-249(Python数据库API规范),包括pymssqlcx_oracleibm_dbpymysql,{{ 1}}和sqlite3中的pyodbc中要作为预准备语句中的参数绑定的变量将进入cur.execute(query, params)的第二个参数。

具体来说,在迭代过程中将文件级变量与CSV变量组合在一起,并将它们作为参数列表或元组传递给执行调用。下面使用csv.DictReader方法,从csv数据构建每行的字典。

注意::下面的查询保留了主键 serial_id ,该键应通过Postgres表中的序列填充。

psycopg2