在我的项目中,我需要计算从哪个位置访问数据库中存储的每个URL。
例如:
example.com/1 - {'UK': 3, 'Germany': 15}
example.com/2 - {'Italy': 7, 'USA': 4}
我目前正在使用SQLite3和SQLAlchemy。
有什么方法可以将字典中的数据保存到数据库中吗?还是有可能以更好的方式实现这一目标?
我唯一想到的就是将数据保存为JSON转换为字符串。
答案 0 :(得分:1)
这是一个简单的数据库设计问题。
我建议:
CREATE TABLE country_clicks (
id INTEGER PRIMARY KEY,
country STRING,
accessed_from STRING,
clicks INTEGER
);
CREATE UNIQUE INDEX country_clicks_idx ON country_clicks(country, accessed_from);
通常,我会建议使用country和access_from作为复合PRIMARY KEY。但是SQLite从一开始就没有这样的事情(在新版本中有一些机制可以做到这一点。)
您必须确保在表中插入新值时,country / accessed_from组合尚不存在。如果是这样,只需更新点击次数即可。
答案 1 :(得分:1)
使用复合主键:
CREATE TABLE country_clicks(
url TEXT NOT NULL
, country TEXT NOT NULL
, clicks INTEGER
, PRIMARY KEY(url, country)
) WITHOUT ROWID
侧面说明:如果您只有(url, country)
对的列表,并且需要计算列表中每个唯一组合出现的次数,则sqlite可以为您完成此操作。将上面的点击数列更改为clicks INTEGER NOT NULL DEFAULT 1
,然后通过以下行进行插入:
INSERT INTO country_clicks(url, country)
VALUES (?, ?)
ON CONFLICT (url, country) DO UPDATE SET clicks = clicks + 1
(注意:这需要Sqlite 3.24或更高版本才能获得upsert支持)。