Python3 / SQLite3 |如何从列表或元组列表创建多个表?

时间:2016-11-13 15:17:14

标签: python list python-3.x sqlite tuples

我有一个像这样的元组列表:

>>> all_names = c.execute("""select name from fb_friends""")
>>> for name in all_names:
...     print(name)
('Jody Ann Elizabeth Lill',)
('Georgia Gee Smith',)
...(282 more)...
('Josh Firth',)
('Danny Hallas',)

我想为每个人创建一张桌子。首先,我需要用下划线替换所有空格,以便成为SQLite3表名,所以我这样做:

>>> all_names = c.execute("""select name from fb_friends""")
>>> for name in all_names:
...     friends_name = name[0].replace(" ", "_")
...     print(friends_name)
Jody_Ann_Elizabeth_Lill
Georgia_Gee_Smith
...(282 more)...
Josh_Firth
Danny_Hallas

所以,如果我理解正确,我现在有一个列表,而不是元组列表..?从这个列表中创建所有表格应该很简单:

>>> all_names = c.execute("""select name from fb_friends""")
>>> for name in all_names:
...     friends_name = name[0].replace(" ", "_")
...     c.execute("""create table {0} (`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `work` TEXT NOT NULL, `education` TEXT, `current_city` TEXT, `phone_number` TEXT, `dob` TEXT, `gender` TEXT, `sexual_orientation` TEXT, `religion` TEXT, `relationship_status` TEXT, `about_me` TEXT )""".format(friends_name))

但它只是从列表中的第一个名称创建一个表,我原以为for循环会遍历名称列表并为每个名称创建一个表,这就是我想要的,有人可以就一些事情告诉我:

  1. 使用.replace方法获取名称中的下划线的最佳方法是什么?如果不是那么是什么?
  2. 为什么for循环不会遍历每个名​​称来创建表?我该怎么做呢?
  3. 我的方法是否正确?如果没有,那么哪种方法会做得更好?

3 个答案:

答案 0 :(得分:1)

请尝试以下解决方案:

staff = ['a', 'b', 'c']


for name in staff:
    c.execute("CREATE TABLE IF NOT EXISTS %s (name TEXT);" % (name))

答案 1 :(得分:0)

因此,在不断使用各种方法后,我设法弄清楚如何做到这一点。为了使代码工作,所有必须做的就是将其转换为列表,如下所示:

>>> all_names = c.execute("""select name from fb_friends""")
>>> names = list(all_names) # I just added this line and changed the variable names below
>>> for name in names:
...     friends_name = name[0].replace(" ", "_")
...     c.execute("""create table {0} (`id` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, `work` TEXT NOT NULL, `education` TEXT, `current_city` TEXT, `phone_number` TEXT, `dob` TEXT, `gender` TEXT, `sexual_orientation` TEXT, `religion` TEXT, `relationship_status` TEXT, `about_me` TEXT )""".format(name))

答案 2 :(得分:0)

虽然你的直接问题可能是因为原始游标没有从数据库中检索所有记录而cursor.fetchall() or list(cursor)将所有行导入客户端(Python),但是内存占用很少,但可以确保在脚本中导入行,如果不鼓励数据库设计的最佳实践,那将是一种疏忽。

正如评论中所提到的,重新考虑这种方法并规范整个数据库模型,以便在relational databases之间实现表之间的一对多或多对多关系。这样就可以避免280多个结构相同的表的开销,维护和查询挑战。

根据您的解释,您听起来需要一个与friendsworkplaces表及其他任何内容的一对多链接的独特posts表,所有这些表都连接到{{ 1}}作为外键。最终,您只需创建一次表并使用追加查询填充数据:

friendid