Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用Psycopg2创建多个表_Python_Postgresql_Psycopg2 - Fatal编程技术网

Python 使用Psycopg2创建多个表

Python 使用Psycopg2创建多个表,python,postgresql,psycopg2,Python,Postgresql,Psycopg2,我正在尝试使用psycopg2创建多个(4000)csv文件并将其导入我的postgres数据库。所有csv文件都具有相同的列名和类型。我就是不知道如何高效地订购 Python 3.5,Postgre-9.5.12 问题: .格式工作不正常(未将“%s”替换为sec_名称) 我应该指定要插入的列还是使用copy_from 我可以再简化这个过程吗 import psycopg2 import os conn = psycopg2.connect("dbname=postgres user=po

我正在尝试使用psycopg2创建多个(4000)csv文件并将其导入我的postgres数据库。所有csv文件都具有相同的列名和类型。我就是不知道如何高效地订购

Python 3.5,Postgre-9.5.12

问题:

  • .格式工作不正常(未将“%s”替换为sec_名称)
  • 我应该指定要插入的列还是使用copy_from
  • 我可以再简化这个过程吗

    import psycopg2
    import os
    
    conn = psycopg2.connect("dbname=postgres user=postgres")
    cur = conn.curser()
    
    # file_dir == directory containing all the .csv
    sec_files = os.listdir("file_dir")
    
    for files in sec_files:
    
        # Cuts off all whitespace and .csv
        sec_name = ''.join(files.split())[:-4]
    
        cur.execute(''' CREATE TABLE '%s' (
            Date NOT NULL UNIQUE DATE PRIMARY KEY
            col2 FLOAT NOT NULL
            col3 FLOAT NOT NULL
            col4 FLOAT NOT NULL
            col5 FLOAT NOT NULL
            col6 FLOAT NOT NULL
            col7 INTEGER  NOT NULL )''').format(sec_name)
         print("Table created ",sec_name)
    
        with open(os.path.abspath(files),'r') as f:
            next(f)
            for row in reader:
                 cur.copy_from(f,sec_name, sep=',')
    
        conn.commit()
        print('Data inserted into ', sec_name, ' completed')
    

重新格式化了您的代码,没有改变插入数据的方式,因为这会更具重构性,但鉴于您所展示的内容,这将是执行所展示代码的正确方式

import os
import psycopg2
from psycopg2.extensions import AsIs

query = """
        CREATE TABLE %(table)s (
            Date NOT NULL UNIQUE DATE PRIMARY KEY
            col2 FLOAT NOT NULL
            col3 FLOAT NOT NULL
            col4 FLOAT NOT NULL
            col5 FLOAT NOT NULL
            col6 FLOAT NOT NULL
            col7 INTEGER  NOT NULL)
        """

sec_files = os.listdir('file_dir')
conn = psycopg2.connect('dbname=postgres user=postgres')

with conn.cursor() as cursor:
    for file in sec_files:
        name = os.path.basename(file).split('.')[0]
        cursor.execute(query, {'table': AsIs(name)})
        print('Table created', name)

        with open(os.path.abspath(file), 'r') as fin:
            next(f)
            cursor.copy_from(f, name, sep=',')
            print('Data inserted into ', name, ' complete')

不要使用
格式
你很容易被SQL注入,如果你想插入表名,你需要
psycopg2.extensions
中的
AsIs
模块,你还想创建4000个表吗?似乎有点不对劲……我不明白如何使用psycopg2.extensions.AsIs。是的,4000张。如果你在做4000张桌子,你的设计模式有问题,只是说。。。