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

Python 在psycopg2/postgres命令中使用外部变量,python,postgresql,psycopg2,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('_'))

我有数千个相关的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()
根据大多数数据库API遵循的(Python数据库API规范),包括
pymssql
cx\u oracle
ibm\u DB
pymysql
sqlite3
,以及
pyodbc
,在
psycopg2
中,要绑定为准备语句中的参数的变量将进入的第二个参数

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

注意:下面的查询省略了主键serial\u id,它应该通过Postgres表中的序列填充

for file in target_directory.rglob('*.csv'):
    print(str(file.stem).split('_'))

    # FILE LEVEL VARIABLES
    state_name = str(file.stem).split('_')[0]
    data_category = str(file.stem).split('_')[1]
    workforce_segment = str(file.stem).split('_')[2]
    job_type = str(file.stem).split('_')[3]
    year = str(file.stem).split('_')[4]

    # PREPARED STATEMENT
    sql = """INSERT INTO opendata_uscensus_usa_lodes_wac  
                  (state_name, data_category, workforce_segment,
                   job_type, year, w_geocode, C000, CA01, CA02, CA03, CE01, CE02)
             VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s)"""

    with open(file,'r') as file_in:
        # ITERATE THROUGH FOR CSV VARIABLES
        reader = csv.DictReader(file_in)
        for row in reader:
           cur.execute(sql, (state,data_category,workforce_segment,job_type,year,
                             row['w_geocode'], row['C000'], row['CA01'],
                             row['CA02'], row['CA03'], row['CE01'], row['CE02'])
                       )

        conn.commit()

如何在循环的每次迭代中创建一个表,但在每个循环中插入一个表?这将留下许多空表。@Parfait-非常好的一点…以前没有捕捉到这一点…我基本上理解这一点--我可以看到它如何从python输入值--但我对数据如何从表(和主键列)中来感到困惑我不理解你的问题:来自表格的数据最终会出现在表格中。你能重新措辞吗?我希望您不要混淆与列同名的变量。参数中使用的Python变量可以命名为任何名称。一些值(关于文件的元数据)来自Python脚本,一些值来自CSV。我不明白CSV值如何在表中结束。请显示CSV。您需要遍历它的行。有很多这样的例子,我在原始文章中添加了示例行段。
state\u name、data\u category、workforce\u segment、job\u type、year
变量从文件名中提取,而不是从CSV中提取。