使用python函数式编程将csv文件导入sqllite3

使用python函数式编程将csv文件导入sqllite3,python,csv,import,sqlite,Python,Csv,Import,Sqlite,我知道还有其他一些帖子,但我没能找到我想问的具体问题。 我使用的是US_baby_名称csv文件。并希望将此csv文件作为表逐行导入sqlite3 我能够创建名为storage的表。 然后我尝试读取csv文件中的行并将其放入该表中,但我一定是做错了什么 import sqlite3 as sql from sqlite3 import Error import csv def CreateConnection ( dbFileName ): try: conn = sql.c

我知道还有其他一些帖子,但我没能找到我想问的具体问题。 我使用的是US_baby_名称csv文件。并希望将此csv文件作为表逐行导入sqlite3

我能够创建名为storage的表。 然后我尝试读取csv文件中的行并将其放入该表中,但我一定是做错了什么

import sqlite3 as sql
from sqlite3 import Error
import csv

def CreateConnection ( dbFileName ):
   try:
      conn = sql.connect(dbFileName)
      return conn
   except Error as e:
      print(e)

   return None

def CreateNew( dbConnection, new):
     sql =  """INSERT INTO storage (dat, Id, Name, Year, group, subgroup, Count)
        VALUES (?,?,?,?,?,?,?)"""

     try:
       cursor = dbConnection.cursor()
       cursor.execute(sql, new)
       return cursor.lastrowid
     except Error as e:
       print(e)

def Main():
  database = "storage.db"
  dbConnection = CreateConnection(database)

  with open('storage.csv', 'rb') as fin:
     dr = csv.DictReader(fin)
     to_db = [(i['dat'], i['Id'], i['Name'], i['Year'], i['group'], i['subgroup'], i['Count']) \
        for i in dr]

    cursor.executemany(CreateNew(sql, to_db))

    dbConnection.close()

if __name__ == "__main__":
  Main()
我相信我的cursor.executemany是错的,但我不知道还能做什么


谢谢

您的大部分代码几乎都是正确的,但是:

  • cursor.execute(sql,new)
    中,您正在将一个iterable,
    new
    传递给
    sqlite3.execute()
    (它需要一个简单的sql语句),而不是
    sqlite3.executemany()
  • 此外,
    CreateNew()
    的结果是一个整数,
    lastrowid
    ,您将该结果传递给
    executemany()
  • 必须使用
    Connection.commit()
    保存对数据库的更改,并使用
    Connection.rollback()
    放弃更改
  • 您必须在
    r
    rt
    模式下以文本文件的形式打开
    csv.DictReader
    类的文件
  • 最后,请记住,
    sqlite3.Connection
    是一个上下文管理器,因此您可以在
    with
    语句中使用它
这应该是您期望的结果:

import sqlite3 as sql
from sqlite3 import Error
import csv


def create_table(conn):
    sql = "CREATE TABLE IF NOT EXISTS baby_names("\
        "dat TEXT,"\
        "Id INTEGER PRIMARY KEY,"\
        "Name TEXT NOT NULL,"\
        "Year INTEGER NOT NULL,"\
        "Gender TEXT NOT NULL,"\
        "State TEXT NOT NULL,"\
        "Count INTEGER)"

    conn.execute(sql)
    conn.execute("DELETE FROM baby_names")

def select_all(conn):
    for r in conn.execute("SELECT * FROM baby_names").fetchall():
        print(r)


def execute_sql_statement(conn, data):
    sql = "INSERT INTO baby_names "\
        "(dat, Id, Name, Year, Gender, State, Count) "\
        "VALUES (?,?,?,?,?,?,?)"

    try:
        cursor = conn.executemany(sql, data)
    except Error as e:
        print(e)
        conn.rollback()
        return None
    else:
        conn.commit()
        return cursor.lastrowid

def main():        
    with sql.connect('baby_names.db') as conn, open('US_Baby_Names_right.csv', 'r') as fin:
        create_table(conn)

        dr = csv.DictReader(fin)
        data = [(i['dat'], i['Id'], i['Name'], i['Year'], i['Gender'], i['State'], i['Count']) for i in dr ]

        lastrowid = execute_sql_statement(conn, data)

        select_all(conn)


main()
我添加了一个
create_table()
函数来测试我的代码。我还编写了一个示例测试文件,如下所示:

dat,Id,Name,Year,Gender,State,Count 1,1,John,1998,M,Washington,2 2,2,Luke,2000,M,Arkansas,10 3,3,Carrie,1999,F,Texas,3
您的大部分代码几乎都是正确的,但是:

  • cursor.execute(sql,new)
    中,您正在将一个iterable,
    new
    传递给
    sqlite3.execute()
    (它需要一个简单的sql语句),而不是
    sqlite3.executemany()
  • 此外,
    CreateNew()
    的结果是一个整数,
    lastrowid
    ,您将该结果传递给
    executemany()
  • 必须使用
    Connection.commit()
    保存对数据库的更改,并使用
    Connection.rollback()
    放弃更改
  • 您必须在
    r
    rt
    模式下以文本文件的形式打开
    csv.DictReader
    类的文件
  • 最后,请记住,
    sqlite3.Connection
    是一个上下文管理器,因此您可以在
    with
    语句中使用它
这应该是您期望的结果:

import sqlite3 as sql
from sqlite3 import Error
import csv


def create_table(conn):
    sql = "CREATE TABLE IF NOT EXISTS baby_names("\
        "dat TEXT,"\
        "Id INTEGER PRIMARY KEY,"\
        "Name TEXT NOT NULL,"\
        "Year INTEGER NOT NULL,"\
        "Gender TEXT NOT NULL,"\
        "State TEXT NOT NULL,"\
        "Count INTEGER)"

    conn.execute(sql)
    conn.execute("DELETE FROM baby_names")

def select_all(conn):
    for r in conn.execute("SELECT * FROM baby_names").fetchall():
        print(r)


def execute_sql_statement(conn, data):
    sql = "INSERT INTO baby_names "\
        "(dat, Id, Name, Year, Gender, State, Count) "\
        "VALUES (?,?,?,?,?,?,?)"

    try:
        cursor = conn.executemany(sql, data)
    except Error as e:
        print(e)
        conn.rollback()
        return None
    else:
        conn.commit()
        return cursor.lastrowid

def main():        
    with sql.connect('baby_names.db') as conn, open('US_Baby_Names_right.csv', 'r') as fin:
        create_table(conn)

        dr = csv.DictReader(fin)
        data = [(i['dat'], i['Id'], i['Name'], i['Year'], i['Gender'], i['State'], i['Count']) for i in dr ]

        lastrowid = execute_sql_statement(conn, data)

        select_all(conn)


main()
我添加了一个
create_table()
函数来测试我的代码。我还编写了一个示例测试文件,如下所示:

dat,Id,Name,Year,Gender,State,Count 1,1,John,1998,M,Washington,2 2,2,Luke,2000,M,Arkansas,10 3,3,Carrie,1999,F,Texas,3
使用函数打开数据库连接并返回连接不是一个好主意。使用上下文管理器。您正在将一个执行数据库事务的函数传递给ExecuteMy,这并不意味着使用函数打开数据库连接并返回连接是一个坏主意。使用上下文管理器。您正在将一个执行数据库事务的函数传递给executemany,这根本不起作用。谢谢,您的评论使我很容易看到我的错误!我真的很感谢你,你的评论让我很容易看到我的错误!我真的很感激