使用python创建SQL插入脚本

使用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

我有一个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, 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数据转换为关系表。