通过Python将数据从csv插入postgreSQL数据库

通过Python将数据从csv插入postgreSQL数据库,python,sql,database,postgresql,csv,Python,Sql,Database,Postgresql,Csv,我对postgreSQL或SQL是全新的。 我试图通过Python在数据库中创建一个表,然后将数据从.csv文件加载到表中。 我的代码如下所示: import csv import psycopg2 #Establish connection to database con = psycopg2.connect( host = "localhost", database = "kundeavgang", user = "postgres",

我对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))
索引器错误:元组索引超出范围


所有帮助或解释将不胜感激

%s
是将插入并通过以下元组传递的值的占位符:

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

insert语句将要插入20列的问题是,您在元组中提供了20个值,但有22个占位符(
%s
)。
%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>代码>).< /p> 从文本文件中插入大容量插入,考虑或<代码> PysCopg2。此外,请确保提交您的执行:

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()

<>文本文件中的大容量插入,考虑或<代码> PycPGG2<代码>。此外,请确保提交您的执行:

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()

问题是要填充的列数与提供的列表长度不匹配。这是处理大量列时容易犯的错误。减少错误风险的一种方法是使用列或值列表的长度来构建语句

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提供了这一点。

问题是要填充的列数与提供的列表长度不匹配。这是处理大量列时容易犯的错误。减少错误风险的一种方法是使用列或值列表的长度来构建语句

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提供了这一点。

@snakecharmerb您能详细说明这意味着什么吗?或者我如何将我想要的实际数据输入SQL而不是22%s?为什么不使用并绕过将数据读入Python?您的
列表有21个元素,但您的values子句包含22%s占位符。它们需要匹配。@Parfait:在我学习python知识的同时努力开发:)@snakecharmerb你能详细说明一下这意味着什么吗?或者我如何将我想要的实际数据输入SQL而不是22%s?为什么不使用并绕过将数据读入Python?您的
列表有21个元素,但您的values子句包含22%s占位符。它们需要匹配。@Parfait:正在开发我的python Knowledge,而我正在开发:)好的,%s保存所有数据类型吗?此外,对于行[0]索引,我总共有21个。当减少到21个占位符时,我会收到一条新的错误消息:值(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)“”,(客户ID、性别、老年人、合作伙伴、家属、任期、电话服务、多线、互联网服务、在线安全、在线备份、设备保护、技术支持、流媒体电视、流媒体电影、合同、无纸化收费、付款方式、总费用、客户流失)索引器错误:元组索引超出范围知道我做错了什么吗?
%s
应用于所有数据类型。看看这里:@Aleks您的元组中有20个值,您在哪一行得到错误?此错误表示您正试图访问元组中不存在的索引。请确保insert语句中的列数、占位符数和为占位符提供的元组中的值数相等。此外,您定义了21个变量(访问0-20个索引),但语句中只有20列。为什么?好的,是%s保存所有数据类型吗?此外,对于行[0]索引,我总共有21个。当减少到21个占位符时,我会收到一条新的错误消息:值(%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)“”,(客户ID、性别、老年人、合作伙伴、家属、任期、电话服务、多线、互联网服务、在线安全、在线备份、设备保护、技术支持、流媒体电视、流媒体电影、合同、无纸化收费、付款方式、总费用、客户流失)索引器错误:元组索引超出范围知道我做错了什么吗?
%s
应用于所有数据类型。看看这里:@Aleks您的元组中有20个值,您在哪一行得到错误?此错误表示您正试图访问元组中不存在的索引。请确保insert语句中的列数、占位符数和为占位符提供的元组中的值数相等。此外,您定义了21个变量(访问0-20个索引),但语句中只有20列。为什么?