使用python函数式编程将csv文件导入sqllite3
我知道还有其他一些帖子,但我没能找到我想问的具体问题。 我使用的是US_baby_名称csv文件。并希望将此csv文件作为表逐行导入sqlite3 我能够创建名为storage的表。 然后我尝试读取csv文件中的行并将其放入该表中,但我一定是做错了什么使用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
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是错的,但我不知道还能做什么
谢谢您的大部分代码几乎都是正确的,但是:
- 在
中,您正在将一个iterable,cursor.execute(sql,new)
传递给new
(它需要一个简单的sql语句),而不是sqlite3.execute()
李>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
您的大部分代码几乎都是正确的,但是:
- 在
中,您正在将一个iterable,cursor.execute(sql,new)
传递给new
(它需要一个简单的sql语句),而不是sqlite3.execute()
李>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,这根本不起作用。谢谢,您的评论使我很容易看到我的错误!我真的很感谢你,你的评论让我很容易看到我的错误!我真的很感激