簡體   English   中英

Python3/SQLite3 | 如何從一個列表或元組列表創建多個表?

[英]Python3/SQLite3 | How to create multiple tables from a list or list of 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. 我的方法完全正確嗎? 如果不是,那么什么方法會做得更好?

雖然您的直接問題可能是由於原始游標未從數據庫中檢索所有記錄而cursor.fetchall() ,而cursor.fetchall()list(cursor)所有行導入客戶端 (Python),但可能會占用少量內存,但可以確保在腳本中導入行,我不鼓勵數據庫設計中的最佳實踐。

正如評論中提到的,重新考慮這種方法並將整個數據庫模型規范化為表之間的一對多或多對多關系,就像 關系數據庫打算做的那樣。 通過這種方式,您可以避免 280 多個結構相同的表的開銷、維護和查詢挑戰。

根據您的解釋,您聽起來像是需要一個獨特的friends表,其中包含與workplacesposts表以及任何其他人的一對多鏈接,所有這些都作為外鍵連接到一個friendid 最終,您只需創建一次表並使用附加查詢填充數據:

-- CREATE TABLES
CREATE TABLE friends (
     `friendid` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
     `first_name` TEXT, last_name TEXT,
     `work` TEXT, `education` TEXT, 
     `current_city` TEXT, `phone_number` TEXT, 
     `dob` TEXT, `gender` TEXT, `sexual_orientation` TEXT, 
     `religion` TEXT, `relationship_status` TEXT, `about_me` TEXT);

CREATE TABLE workplaces (
     `workplaceid` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
     `friendid` INTEGER,
     `workplace` TEXT NOT NULL, 
     `city` TEXT, `state` TEXT);

CREATE TABLE posts (
     `postid` INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT, 
     `friendid` INTEGER,
     `text` TEXT NOT NULL,
     `postdate` TEXT, `postlocation` TEXT);

-- POPULATE TABLES (adjust to actual tables/fields)  
INSERT INTO friends (first_name, last_name)
SELECT SUBSTR(`name`, 1, INSTR(`name`, " ")) AS first_name,
       SUBSTR(`name`, INSTR(`name`, " ")+1) AS last_name,
FROM fb_friends;

INSERT INTO workplaces (friendid, work, city)
SELECT f.friendid, w.work, w.city 
FROM fb_work w INNER JOIN friends f ON w.name = f.first_name & ' ' & f.last_name;

INSERT INTO posts (friendid, `text`, postdate)
SELECT f.friendid, p.post_text, p.post_date 
FROM fb_posts p INNER JOIN friends f ON p.name = f.first_name & ' ' & f.last_name;

請嘗試這個解決方案:

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


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

因此,在不斷嘗試各種方法之后,我設法弄清楚了如何做到這一點。 為了使代碼工作,所有必須做的就是將其轉換為列表,如下所示:

>>> 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))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM