从pdo结果集创建sqlite表?

时间:2015-03-26 12:27:02

标签: php sqlite pdo

有没有人能够或者能够指出使用php pdo创建sqlite内存表的好例子,其中表列格式直接从PDO查询结果中收集?

我的用例是,我希望使用SQLite3来存储从多个不同数据库返回的多个查询(所有相同的列顺序等)中的多个结果集。最终目标是使用SQLite来减少"减少"最终确定的数据。

我知道我可以为每个查询结果编写一个自定义函数,但我的目标是实现一个通用解决方案,不需要知道表结构,传递x同源结果集(例如PDO :: FETCH_ASSOC数组结果)并返回一个临时的SQLite表名,能够在丢弃数据之前使用SQLite查询结果集的UNION。

似乎这会出现在互联网上,而SQLite网站甚至暗示这是一个用例,但我所有的搜索都指向基本的SQLite如何创建和查询...提前感谢!

1 个答案:

答案 0 :(得分:0)

由于没有人回复,这是一个艰难的努力。这是基于db句柄是mySQL,但它可能会忽略类型,让sqlite做一些魔术。如果是这样,请看这个链接:

https://www.sqlite.org/datatype3.html

try{
$link = connectToDB_PDO();
$strSQL="select * from website.customers";
$mySth=$link->prepare($strSQL);
$meta=array();
$mySth->execute();
foreach(range(0, $mySth->columnCount() - 1) as $column_index){
  $meta[] = $mySth->getColumnMeta($column_index);
}

$result=$mySth->fetchAll(PDO::FETCH_ASSOC);

// Create new database in memory
$memdb = new PDO('sqlite::memory:');
$memdb->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);    // Set errormode to exceptions
$tablename='mytable';

$colnames=array();                      // for the insert statement below
$tableSQL="CREATE TABLE $tablename ( ";
foreach($meta as $col){
  $colnames[]=$col['name'];
  $tableSQL.=" ".$col['name']. " ".$col['native_type']." ";
  if(array_key_exists('flags',$col)){
    foreach($col['flags'] as $flag){
      switch($flag)
      {
        case 'not_null':
          $tableSQL.=" NOT NULL ";
          break;
        case 'primary_key':
          $tableSQL.=" PRIMARY KEY ";
          break;
        default:
      } // end switch
    }  // end each flag
  } // end if flags
  $tableSQL.=", ";
} // end each column
$tableSQL=rtrim($tableSQL,", ");
$tableSQL.=")";

$memdb->exec($tableSQL);
$pragmaSQL="PRAGMA table_info($tablename)";
$st2=$memdb->prepare($pragmaSQL);
$st2->execute();
$pragres=$st2->fetchAll(PDO::FETCH_ASSOC);

$insert = "INSERT INTO $tablename (".implode(",",$colnames).") ". 
"VALUES (:".implode(",:",$colnames).")";

$stmt = $memdb->prepare($insert);
foreach ($result as $row) {
  $parms=array();
  for($i=0;$i<count($colnames);$i++){
    $parms[':'.$colnames[$i]]=$row[$colnames[$i]];  // Bind parameters to statement variables
  }
  $stmt->execute($parms);
}                       

$strSQL="SELECT sum(customers_id) FROM $tablename";
$sth=$memdb->prepare($strSQL);
$sth->execute();
$result2=$sth->fetchAll(PDO::FETCH_ASSOC);
foreach ($result2 as $m) {
  echo print_r($m,true);
}

$memdb->exec("DROP TABLE $tablename");
$memdb = null;

} catch(PDOException $ e){      echo $ e-&gt; getMessage();      error_log中($ E-&GT;的getMessage());    } 我不确定这是不是最好的答案,但它是一个开始 - 急于看到其他人的输入!