用户在使用 Beautiful Soup 爬取表单字段 ID 后,希望将这些 ID 写入 Sqlite3 数据库中。但是,由于存在多个域,每个域都有自己的表单字段 ID 列表,因此用户需要设计合适的数据库表结构。
- 解决方案 为了解决这个问题,有两种解决方案:
-
使用两个表结构:
- 表一: 称为 domains,包含两个字段:id 和 name,其中 id 是自动生成的整数主键,name 是域的 URL。
- 表二: 称为 field_ids,包含三个字段:id、domain_id 和 value,其中 id 是自动生成的整数主键,domain_id 是外键,引用到 domains 表中的 id 字段,value 是表单字段 ID。
-
使用单表结构:
- 建立一个单表,包含三个字段:id、domain 和 field_ids,其中 id 是自动生成的整数主键,domain 是域的 URL,field_ids 是一个文本字段,用于存储表单字段 ID 的列表。
这两种解决方案都有各自的优缺点。使用两个表结构的好处是,它可以更好地维护数据的完整性,并且可以更轻松地查询和更新数据。但是,它的缺点是需要更多的表,这可能会使数据库设计和维护变得更加复杂。使用单表结构的好处是,它更简单,也更容易设计和维护。但是,它的缺点是,它可能会导致数据冗余,并且在查询和更新数据时可能会遇到一些限制。
最终选择哪种解决方案取决于具体的需求和实际情况。
代码示例
import sqlite3
# 连接到数据库
connection = sqlite3.connect('form_fields.db')
cursor = connection.cursor()
# 使用两个表结构
# 创建表 domains
cursor.execute('''CREATE TABLE IF NOT EXISTS domains (
id INTEGER PRIMARY KEY,
name TEXT)''')
# 创建表 field_ids
cursor.execute('''CREATE TABLE IF NOT EXISTS field_ids (
id INTEGER PRIMARY KEY,
domain_id INTEGER,
value TEXT,
FOREIGN KEY (domain_id) REFERENCES domains(id))''')
# 插入数据到表 domains
cursor.execute('''INSERT INTO domains (name) VALUES (?)''', ('http://example.com',))
cursor.execute('''INSERT INTO domains (name) VALUES (?)''', ('http://example2.com',))
# 插入数据到表 field_ids
cursor.execute('''INSERT INTO field_ids (domain_id, value) VALUES (?, ?)''', (1, 'username'))
cursor.execute('''INSERT INTO field_ids (domain_id, value) VALUES (?, ?)''', (1, 'password'))
cursor.execute('''INSERT INTO field_ids (domain_id, value) VALUES (?, ?)''', (2, 'email'))
cursor.execute('''INSERT INTO field_ids (domain_id, value) VALUES (?, ?)''', (2, 'phone'))
# 使用单表结构
# 创建表 form_fields
cursor.execute('''CREATE TABLE IF NOT EXISTS form_fields (
id INTEGER PRIMARY KEY,
domain TEXT,
field_ids TEXT)''')
# 插入数据到表 form_fields
cursor.execute('''INSERT INTO form_fields (domain, field_ids) VALUES (?, ?)''', ('http://example.com', 'username,password'))
cursor.execute('''INSERT INTO form_fields (domain, field_ids) VALUES (?, ?)''', ('http://example2.com', 'email,phone'))
# 提交更改
connection.commit()
# 关闭连接
connection.close()