将字典插入sqlite3

时间:2018-08-05 08:33:11

标签: database sqlite sqlalchemy flask-sqlalchemy

在我的项目中,我需要计算从哪个位置访问数据库中存储的每个URL。

例如:

example.com/1 - {'UK': 3, 'Germany': 15}
example.com/2 - {'Italy': 7, 'USA': 4}

我目前正在使用SQLite3和SQLAlchemy。

有什么方法可以将字典中的数据保存到数据库中吗?还是有可能以更好的方式实现这一目标?

我唯一想到的就是将数据保存为JSON转换为字符串。

2 个答案:

答案 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支持)。