使用python创建SQL插入脚本
我有一个csv文件。我想用python以关系方式组织这些(非规范化)数据: 应创建连接表的ID 例如,从csv文件分割我的数据并创建m:n关系。我的结果应该是三张表 下面的例子可以说明这一点:使用python创建SQL插入脚本,python,sql,relational-database,Python,Sql,Relational Database,我有一个csv文件。我想用python以关系方式组织这些(非规范化)数据: 应创建连接表的ID 例如,从csv文件分割我的数据并创建m:n关系。我的结果应该是三张表 下面的例子可以说明这一点: person_name person_age, pet_name Lisa, 8, Snowball I Lisa, 8, Snowball II Bart, 10, Santa's Little Helper 结果应该是: person_ID, person_name, person age 1, L
person_name person_age, pet_name
Lisa, 8, Snowball I
Lisa, 8, Snowball II
Bart, 10, Santa's Little Helper
结果应该是:
person_ID, person_name, person age
1, Lisa, 8
2, Bart, 10
pet_ID, pet_Name
1, Snowball I
2, Snowball II
3, Santa's Little Helper
person_ID, pet_ID
1, 1
1, 2
2, 3
我想知道python中是否有模块或一些代码来实现这一点
编辑:
到目前为止,我的策略是创建一个带有格式化字符串的mySQL脚本。下面的代码显示了我如何创建一个插入脚本,而无需分配任何新ID或键
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import csv
#set counter variable
cntr = 0
# open file to read
myfile = open('insert_bundesland.sql', 'w')
# Create header
myfile.write('INSERT INTO tbl_local (loc_gemeindeschl_ID, loc_bundesland_ID, loc_bundesland, loc_stadt, loc_stadt_status, loc_einwohner, loc_einwohner_m, loc_einwohner_w)\n')
# open csv file
with open('gem_schl.csv') as f:
reader = csv.reader(f)
# init for loop - loop over row
for row in reader:
# split if there is beside the name of city a status of the city
x = str.split(row[3], ",")
if len(x) == 1:
# if there is no status assign NULL string value
x.append('NULL')
del row[3]
x = row + x
if cntr == 0:
cntr = cntr + 1
else:
if cntr == 1:
# write sql statements
x = "\tVALUES\t(%s, %s, '%s', '%s', '%s', %s, %s, %s)\n" % (x[2], x[0], x[1], x[11], x[12], x[3], x[4], x[5])
myfile.write(x)
cntr = cntr + 1
else:
x = "\t\t\t(%s, %s, '%s', '%s', '%s', %s, %s, %s)\n" % (x[2], x[0], x[1], x[11], x[12], x[3], x[4], x[5])
myfile.write(x)
myfile.write(';')
myfile.close()
这些模块应该适合您的需要。以下是一个示例:
#!/usr/bin/env python2
import sqlite3
import csv
def quotify(s):
return '"' + s.strip().replace('"', '""') + '"'
con = sqlite3.connect("pets.db")
# Examle contents of pets.csv:
# person_name, person_age, pet_name
# Lisa, 8, Snowball I
# Lisa, 8, Snowball II
# Bart, 10, Santa's Little Helper
with open("pets.csv") as pets:
pets = csv.reader(pets)
with con:
names = next(pets)
names = [name.decode('utf-8') for name in names]
for name in names:
con.execute('drop table if exists %s;' % quotify(name))
con.execute('create table %s (value unique on conflict ignore);'
% quotify(name))
con.execute("drop table if exists master")
st = "create table master(%s);" % (
','.join("%s" % quotify(name) for name in names))
con.execute(st)
for row in pets:
row = [item.decode('utf-8') for item in row]
rowids = []
for name, value in zip(names, row):
rowids.append(
con.execute("insert into %s (value) values(?)"
% quotify(name),
(value.strip(),)).lastrowid)
st = 'insert into master values(%s)' % (
','.join('?' for rowid in rowids))
con.execute(st, rowids)
# Demonstration, using Simpon's example from question:
from pprint import pprint
st = '''select person_name.value, person_age.value, pet_name.value
from person_name, person_age, pet_name, master
where master.person_name = person_name.rowid
and master.person_age = person_age.rowid
and master.pet_name = pet_name.rowid;'''
pprint(con.execute(st).fetchall())
为什么不在Python中使用SQLite之类的SQL模块呢?为了能够有效地回答这个问题,我们需要知道您使用的是什么数据库/dbapi驱动程序,如果您使用的是ORM,您使用的是哪一个?还有数据集有多大。如果它是小的,将不同于如果它是大的。这也是一个很模糊的问题,因为你用词的方式。您是否已经编写了一些代码来读取CSV,如果是的话,请将其包括在内。请向我们展示您到目前为止所拥有的内容,并解释您所坚持的内容。我发现您对堆栈溢出还比较陌生。堆栈溢出是一个问答网站。读者,比如你自己,会提出问题,而其他读者会试图回答。你的帖子似乎缺少一个关键要素:一个问题。你有什么特别的问题吗?很好的提示@Robᵩ, 我也是python新手。我的问题是:是否有一种方便的方法或模块将csv数据转换为关系表。