首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何让Maxmind的Geoip数据库与Postgres + Heroku协同工作

如何让Maxmind的Geoip数据库与Postgres + Heroku协同工作
EN

Stack Overflow用户
提问于 2012-04-30 20:21:07
回答 1查看 1.9K关注 0票数 1

这里有人在Rails 3+,Heroku,Pgsql上运行,并使用Maxmind's Geoip数据库吗?

在MySql上,我可以通过以下方式执行一个简单的查询:

代码语言:javascript
复制
IpToCountry.where('ip_to_countries.ip_number_to >= INET_ATON(?)', '24.24.24.24').order('ip_number_to ASC').limit(1).first

然而,自从转到Pgsql之后,我一直在尝试找到一种方法来正确地查询数据库。到目前为止,我有:

代码语言:javascript
复制
remote_ip_array = '24.24.24.24'.split('.')
remote_ip_number = 16777216*remote_ip_array[0].to_i + 65536*remote_ip_array[1].to_i + 256*remote_ip_array[2].to_i + remote_ip_array[3].to_i
ip_to_country = IpToCountry.where('? >= ip_number_from AND ? <= ip_number_to', remote_ip_number, remote_ip_number).order('ip_number_to ASC').limit(1).first

上面查询的问题是一些IP不匹配。例如:37.59.16.123108.166.92.235

我看过ip4r,但因为我使用的是http://postgres.heroku.com,所以我可能没有安装它的选项。我给支持小组发了一封电子邮件来核实。

在此期间,我们非常感谢任何其他反馈。

EN

回答 1

Stack Overflow用户

发布于 2013-04-01 17:46:51

ip4r本身不太可能对匹配有所帮助。如果您需要子网的GIN索引,例如,为了强制执行存储的CIDR块不能重叠的约束,则最需要使用ip4r。

您有两个选择。第一种,也是最好的一种,是使用PostgreSQLs inet类型,并将ipv4地址存储在inet类型中。然后,您将使用标准文本表示。例如,比较:

代码语言:javascript
复制
select '10.59.3.1'::text > '101.3.4.1';
 ?column? 
----------
 t
(1 row)

使用

代码语言:javascript
复制
select '10.59.3.1'::inet > '101.3.4.1';
 ?column? 
----------
 f
(1 row)

这个类型包含在普通的PostgreSQL中,所以你不需要插件。

第二个选项是创建一个int(inet)函数,如下所示:

代码语言:javascript
复制
CREATE OR REPLACE FUNCTION to_int(inet) RETURNS bigint LANGUAGE SQL IMMUTABLE AS $$
SELECT $1 - '0.0.0.0';
$$;

然后

代码语言:javascript
复制
select to_int('10.0.0.1');
  to_int   
-----------
 167772161
(1 row)

这样你就可以在你的数据库中执行ipv4到int。

不过,我还是推荐使用inet类型的。他们真的很有用。在大多数用例中,您不需要ip4r。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10383617

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档