Вставить данные из CSV в базу данных postgreSQL через Python - PullRequest
1 голос
/ 25 апреля 2020

Я новичок в postgreSQL или SQL вообще. Я пытаюсь создать таблицу в базе данных через Python, а затем загрузить данные из файла .csv в таблицу. Мой код выглядит так:

import csv
import psycopg2

#Establish connection to database 
con = psycopg2.connect(
        host = "localhost",
        database = "kundeavgang",
        user = "postgres",
        password = "postgres",
        )

#Cursor 
cur = con.cursor()

#If a mistake is made, start from scratch
cur.execute("DROP TABLE IF EXISTS kundeavgang")

#Create table
cur.execute('''
            CREATE TABLE "kundeavgang"(
            "customerID" TEXT,
            "gender" TEXT,
            "SeniorCitizen" TEXT,
            "Partner" TEXT,
            "Dependents" TEXT,
            "tenure" INT,
            "PhoneService" TEXT,
            "MultipleLines" TEXT,
            "InternetService" TEXT,
            "OnlineSecurity" TEXT,
            "DeviceProtection" TEXT,
            "TechSupport" TEXT,
            "StreamingMovies" TEXT,
            "Contract" TEXT,
            "PaperlessBilling" TEXT,
            "PaymentMethod" TEXT,
            "MonthlyCharges" FLOAT,
            "TotalCharges" FLOAT,
            "Churn" TEXT
            )
            ''')

#Acsess .csv file
with open('kundeavgang.csv') as csvFile:
    reader = csv.reader(csvFile)
    skipHeader = next(reader) #Account for header
    for row in reader: 
        customerID = row[0]
        gender = row[1]
        SeniorCitizen = row[2]
        Partner = row[3]
        Dependents = row[4]
        tenure = row[5]
        PhoneService = row[6]
        MultipleLines = row[7]
        InternetService = row[8]
        OnlineSecurity = row[9]
        OnlineBackup = row[10]
        DeviceProtection = row[11]
        TechSupport = row[12]
        StreamingTV = [13]
        StreamingMovies = row[14]
        Contract = row[15]
        PaperlessBilling = row[16]
        PaymentMethod = row[17]
        MonthlyCharges = row[18]
        TotalCharges = row[19]
        Churn = row[20]
        cur.execute('''INSERT INTO kundeavgang(customerID,gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,MultipleLines,InternetService,OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingMovies,Contract,PaperlessBilling,PaymentMethod,TotalCharges,Churn)
            VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''',(customerID,gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,MultipleLines,InternetService,OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingMovies,Contract,PaperlessBilling,PaymentMethod,TotalCharges,Churn))


#Commit the transaction
con.commit()

#End connection
con.close()

В pgAdmin таблица выглядит как существующая в базе данных. Тем не менее, я не могу найти фактическую таблицу. Кроме того, я понятия не имею об этой строке кода:

cur.execute('''INSERT INTO kundeavgang(customerID,gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,MultipleLines,InternetService,OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingMovies,Contract,PaperlessBilling,PaymentMethod,TotalCharges,Churn)
            VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''',(customerID,gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,MultipleLines,InternetService,OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingMovies,Contract,PaperlessBilling,PaymentMethod,TotalCharges,Churn))

Что означают все% s? Я нашел его в онлайн-примере, который не очень помог, поэтому я попробовал его, не зная, что это значит. Я видел несколько примеров, где вместо этого ставятся вопросительные знаки, но это также без объяснения причин.

И наконец, поскольку код стоит сейчас, я получаю сообщение об ошибке:

VALUES (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)''',(customerID,gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,MultipleLines,InternetService,OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingMovies,Contract,PaperlessBilling,PaymentMethod,TotalCharges,Churn))

IndexError: индекс кортежа выходит за пределы

Любая помощь или объяснения будут оценены.

Ответы [ 3 ]

2 голосов
/ 25 апреля 2020

Для массовых вставок из текстовых файлов рассмотрим copy_from или copy_expert из psycopg2. Также обязательно зафиксируйте свое выполнение:

cur.execute("DROP TABLE IF EXISTS kundeavgang")
con.commit()

cur.execute('''CREATE TABLE "kundeavgang" ... ''')
con.commit()

with open('kundeavgang.csv') as csvFile:
   next(csvFile) # SKIP HEADERS
   cur.copy_from(csvFile, "kundeavgang", sep=",")

   # POSTGRES COPY COMMAND FOR CSV MODE
   # cur.copy_expert("""COPY "kundeavgang" FROM STDIN WITH CSV""", csvFile)
   con.commit()
2 голосов
/ 25 апреля 2020

%s - это заполнители для значений, которые будут вставлены и пропущены через следующий кортеж:

(customerID,gender,SeniorCitizen,Partner,Dependents,tenure,PhoneService,MultipleLines,InternetService,OnlineSecurity,OnlineBackup,DeviceProtection,TechSupport,StreamingTV,StreamingMovies,Contract,PaperlessBilling,PaymentMethod,TotalCharges,Churn)

Проблема в том, что ваша инструкция вставки собирается вставить в 20 столбцов, вы предоставляете 20 значений в ваш кортеж, но у вас есть 22 заполнителя (%s).

1 голос
/ 25 апреля 2020

Проблема заключается в несоответствии между количеством столбцов, которые нужно заполнить, и длиной предоставленного списка. Это простая ошибка, когда приходится иметь дело с большим количеством столбцов. Один из способов уменьшить риск ошибки - использовать длину списка столбцов или значений для построения оператора.

cols = [name1, name2,...]
vals = [val1, val2, ...]
assert len(cols) == len(vals), 'mismatch between number of columns and number of values'
template = """INSERT INTO tbl ({}) VALUES ({})"""
stmt = template.format(', '.join(cols), ','.join(['%s'] * len(vals)))
cur.execute(stmt, vals)

Обратите внимание, что при динамическом построении имен столбцов рекомендуется заключать их в кавычки - psycopg2 предоставляет инструменты для этого.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...