【问题标题】:Inserting dictionary into sqlite3将字典插入 sqlite3
【发布时间】:2019-01-12 12:46:48
【问题描述】:

在我的项目中,我需要计算存储在数据库中的每个 url 是从哪里访问的。

例如:

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

我目前正在使用 SQLite3 和 SQLAlchemy。

有没有办法将字典中的数据保存在数据库中?或者是否有可能以更好的方式实现这一目标?

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

【问题讨论】:

    标签: database sqlite sqlalchemy flask-sqlalchemy


    【解决方案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 作为复合主键。但是 SQLite 从一开始就没有这样的东西(在较新的版本中有一些机制可以这样做)。

    您必须确保,当您在表中插入新值时,组合 country/accessed_from 不存在。如果是这样,只需更新点击次数。

    【讨论】:

    • 如果您不打算将(country, accessed_from) 设为主键,至少将其设为唯一索引。
    【解决方案2】:

    使用复合主键:

    CREATE TABLE country_clicks(
         url TEXT NOT NULL
       , country TEXT NOT NULL
       , clicks INTEGER
       , PRIMARY KEY(url, country)
       ) WITHOUT ROWID
    

    旁注:如果您只有(url, country) 对的列表,并且需要计算每个唯一组合在列表中出现的次数,sqlite 可以为您完成。将上面的clicks栏改成clicks INTEGER NOT NULL DEFAULT 1,然后插入via:

    INSERT INTO country_clicks(url, country)
           VALUES (?, ?)
           ON CONFLICT (url, country) DO UPDATE SET clicks = clicks + 1
    

    (注意:这需要 Sqlite 3.24 或更高版本才能支持upsert)。

    【讨论】:

    • 已修复,谢谢。 (无法从我的测试实例中复制过来)
    猜你喜欢
    • 2017-02-11
    • 2022-01-21
    • 2021-06-05
    • 1970-01-01
    • 2021-03-03
    • 2018-06-03
    • 1970-01-01
    • 1970-01-01
    • 2012-10-20
    相关资源
    最近更新 更多