使用输入文件从在线数据库中检索数据

时间:2013-12-04 08:08:48

标签: sql database postgresql

我在MacOSX上使用Postgres 9.3。

如果有人能指出我在这里正确的方向,我会很高兴。我想编写一个连接到现有(在线)数据库(例如this one)并使用带有适当字符串的输入文件(在本例中为MRGID)检索数据(在本例中为shapefile)的函数。对不起,我没有任何代码,我真的不知道从哪里开始,我似乎没有找到任何线程。也许SQL不是要去的地方?

输入文件示例;

species,mrgids
Sp1,4279
Sp1,8366
Sp1,21899
Sp1,21834
Sp1,7130
Sp1,1905
Sp1,21900
Sp1,5679
Sp1,5696

谢谢!

2 个答案:

答案 0 :(得分:2)

这几乎肯定是在数据库之外最好的,使用您选择的语言的脚本。我使用Python和psycopg2,但Ruby + Pg gem,Perl和DBI / DBD :: Pg,甚至PHP和PDO等都是同样合理的选择。

您的代码可以执行HTTP提取,然后(如果它类似于CSV)使用COPY命令将数据加载到PostgreSQL中。如果它是shapefile,您可以将数据提供给PostGISshp2pgsql加载程序,或使用INSERT PostGIS功能创建单独的GeomFromText

你可以从PL / Pythonu或PL / Perlu存储过程中进行HTTP提取,但是从脚本中执行它并没有什么好处,而且它作为外部脚本会更健壮。 / p>

所以,真的,你需要解决这个问题。

您需要使用代码与感兴趣的网站进行对话,可能包括提交表单的HTTP POST等内容。或者,最好使用web API作为为自动脚​​本化交互而设计的站点。使用Perl的LWP,Python的httplib等库,脚本语言可以很容易地使用大多数简单的RESTful API。对于您链接到的网站,如user623952提到的那样,有一个RESTful API

然后你需要代码来获取感兴趣的数据,然后编写代码来读取获取的数据并将其加载到PostgreSQL中。您可能希望下载所有数据然后加载它,或者您可能希望在下载时将其流式传输到数据库中(管道传输到shp2pgsql等)。

答案 1 :(得分:1)

这是PHP和CURL的一个非常基本的例子

我完全使用了输入文件并将其保存为input.txt

species,mrgids
Sp1,4279
Sp1,8366
Sp1,21899
Sp1,21834
Sp1,7130
Sp1,1905
Sp1,21900
Sp1,5679
Sp1,5696

这是 PHP和CURL 做的事情:

<?php 
$base_url = "http://www.marineregions.org/rest/getGazetteerRecordByMRGID.json/%s/";

// just get the input file into an array to use 
$csv = read_file("input.txt"); 

// if you want to see the format of $csv    
print "<pre>".print_r($csv,true)."</pre>";


// go through each csv item and run a curl request on it 
foreach($csv as $i => $data)
{
    $mrgids = $data['mrgids']; 

    $url = sprintf($base_url,$mrgids);

    $response = run_curl_request($url);  

    if ($response!==false)
    {
        //http://us2.php.net/manual/en/function.json-decode.php
        $json = json_decode($response,true); 

        if (!is_null($json))
        {
            // this is where you would write the code to stick this info in 
            // your DB or do whatever you want with it...
            print "<pre>$url \n".print_r($json,true)."\n\n</pre>";
        }
        else 
        {
            print "error:  response was not proper JSON for $url <br/><br/>";
            print $response."<br/><br/><br/>"; 
        }
    }
    else
    {
        print "error:  response was false for $url <br/><br/>";
    }

}


function read_file($filename, $has_headers=true, $assoc=true) 
{
    $headers = array(); 
    $row = 1;

    if (($handle = fopen($filename, "r")) !== FALSE) 
    {
        $return = array(); 

        if ($has_headers) 
        {
            if (($data = fgetcsv($handle, 1000, ",")) !==false)
            {
                $headers = $data; 
            }
        }
        while (($data = fgetcsv($handle, 1000, ",")) !== FALSE) 
        {
            if ($assoc) 
            {
                $temp = array(); 
                foreach($headers as $hi => $header)
                {
                    $temp[$header] = (isset($data[$hi])) ? $data[$hi] : ''; 
                }
                $return[] = $temp; 
            }
            else 
            {
                $return[] = $data; 
            }
        }   
        fclose($handle);
    }
    else
    {
        $return = false; 
    }

    return $return; 
}


// requires PHP CURL extension 
// http://php.net/manual/en/function.curl-setopt.php
function run_curl_request($url)
{ 
    // create curl resource 
    $ch = curl_init();  

    $defaults = array( 
        CURLOPT_POST => false, 
        CURLOPT_HEADER => false, 
        CURLOPT_URL => $url, 
        CURLOPT_FRESH_CONNECT => true, 
          CURLOPT_FAILONERROR => true,  
        CURLOPT_RETURNTRANSFER => true, 
        CURLOPT_FORBID_REUSE => true, 
        CURLOPT_TIMEOUT => 4 
    ); 

   curl_setopt_array($ch, $defaults); 


    // $output contains the output string 
    $output = curl_exec($ch); 

    // close curl resource to free up system resources 
    curl_close($ch);  

    return $output; 
}


?>

如果它有效,你会得到一堆这样的输出

http://www.marineregions.org/rest/getGazetteerRecordByMRGID.json/4279/ 
Array
(
    [MRGID] => 4279
    [gazetteerSource] => IHO 23-3rd: Limits of Oceans and Seas, Special Publication 23, 3rd Edition 1953, published by the International Hydrographic Organization.
    [placeType] => IHO Sea Area
    [latitude] => 39.749996185303
    [longitude] => 5.0942182540894
    [minLatitude] => 35.071937561035
    [minLongitude] => -6.0326728820801
    [maxLatitude] => 44.42805480957
    [maxLongitude] => 16.221109390259
    [precision] => 1079464.0796258
    [preferredGazetteerName] => Mediterranean Sea - Western Basin
    [preferredGazetteerNameLang] => English
    [status] => standard
    [accepted] => 4279
)

备注: