как искать имена столбцов в sqlite3 [duplicate]

Я знаю, что это должно звучать глупо ... но редко бывает.

Проверьте, пытаетесь ли вы выполнить php из

**http://localhost/info.php**

, а не из

file:///var/www/info.php

ps> вы можете заметить, что если вы пишете из shell

php info.php 

, то ответьте на код (это означает php-функции) ..

45
задан Maniero 19 January 2015 в 01:07
поделиться

7 ответов

Используя ответ @ Tarkus, вот регулярные выражения, которые я использовал в R:

getColNames <- function(conn, tableName) {
    x <- dbGetQuery( conn, paste0("SELECT sql FROM sqlite_master WHERE tbl_name = '",tableName,"' AND type = 'table'") )[1,1]
    x <- str_split(x,"\\n")[[1]][-1]
    x <- sub("[()]","",x)
    res <- gsub( '"',"",str_extract( x[1], '".+"' ) )
    x <- x[-1]
    x <- x[-length(x)]
    res <- c( res, gsub( "\\t", "", str_extract( x, "\\t[0-9a-zA-Z_]+" ) ) )
    res
}

Код несколько неаккуратный, но он работает.

0
ответ дан Ari B. Friedman 21 August 2018 в 18:44
поделиться

Попробуйте этот синтаксический анализатор таблицы sqlite, я внедрил парсер sqlite table для анализа определений таблиц в PHP.

Он возвращает полные определения (уникальный, первичный ключ, тип, точность, а не нуль, ссылки , ограничения таблицы ... и т. д.)

https://github.com/maghead/sqlite-parser

0
ответ дан c9s 21 August 2018 в 18:44
поделиться

Это помогает для HTML5 SQLite:

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnParts = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').split(','); ///// RegEx
  var columnNames = [];
  for(i in columnParts) {
    if(typeof columnParts[i] === 'string')
      columnNames.push(columnParts[i].split(" ")[0]);
  }
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});

Вы можете повторно использовать регулярное выражение на своем языке, чтобы получить имена столбцов.

Более короткая альтернатива:

tx.executeSql('SELECT name, sql FROM sqlite_master WHERE type="table" AND name = "your_table_name";', [], function (tx, results) {
  var columnNames = results.rows.item(0).sql.replace(/^[^\(]+\(([^\)]+)\)/g, '$1').replace(/ [^,]+/g, '').split(',');
  console.log(columnNames);
  ///// Your code which uses the columnNames;
});
6
ответ дан GeekTantra 21 August 2018 в 18:44
поделиться
  • 1
    просто отметим, что оба этих решения предполагают, что в поле sql таблицы SQLITE_MASTER нет лишних пробелов или других пробелов. поскольку это поле содержит буквенный текст запроса, используемый для создания таблицы, это не всегда так. Я также думаю, что он неправильно обрабатывает имена полей, содержащие пробелы. – Michael 26 April 2016 в 19:15
  • 2
    Отличное решение. Я был обеспокоен тем, что это не будет включать последующие изменения столбцов, но, по спецификации, "sql" столбец содержит "копию исходного текста инструкции CREATE, который создал объект, кроме нормализованного, как описано выше, и измененного с помощью последующих инструкций ALTER TABLE. & quot ;. – Brett Zamir 5 July 2016 в 14:34

Если вы используете оболочку командной строки для SQLite, тогда .headers on перед выполнением запроса. Вам нужно сделать это только один раз в данном сеансе.

28
ответ дан German Gomez Herrero 21 August 2018 в 18:44
поделиться
  • 1
    Используйте оба параметра .mode column и .headers on для тех, кто хочет получить типичный формат вывода SELECT, который они используют для просмотра с другими оболочками SQL. – Lèse majesté 16 September 2016 в 15:56
SELECT sql FROM sqlite_master
WHERE tbl_name = 'table_name' AND type = 'table'

Затем проанализируйте это значение с помощью Reg Exp (это легко), который может выглядеть примерно так: [(.*?)]

В качестве альтернативы вы можете использовать:

PRAGMA table_info(table_name)
73
ответ дан Konstantin Tarkus 21 August 2018 в 18:44
поделиться
  • 1
    Отличный ответ! – Kalanamith 22 November 2012 в 14:42
  • 2
    Then parse this value with Reg Exp (it's easy)... действительно расплывчато, полный пример запроса с регулярным выражением для получения столбцов defs проделал бы долгий путь здесь. – ChrisProsser 3 July 2017 в 09:46
  • 3
    Я оставляю это для следующих: это регулярное выражение "([^"]+)" (?!\() похоже работает. – Timothé Malahieude 26 August 2017 в 13:14
  • 4
    Это работает для получения имен столбцов, возвращаемых запросом JOIN? Я так не думал. – Throwaway Account 3 Million 1 September 2017 в 02:50

Результирующий набор запроса в PHP предлагает пару функций, позволяющих именно это:

    numCols() 
    columnName(int $column_number )

Пример

    $db = new SQLIte3('mysqlite.db');
    $table = 'mytable';

    $tableCol = getColName($db, $table);

    for ($i=0; $i<count($tableCol); $i++){
        echo "Column $i = ".$tableCol[$i]."\n";
    }           

    function getColName($db, $table){
        $qry = "SELECT * FROM $table LIMIT 1";
        $result = $db->query($qry);
        $nCols = $result->numCols();
        for ($i = 0; $i < $ncols; $i++) {
            $colName[$i] = $result->columnName($i);
        }
        return $colName;
    }
0
ответ дан Luis Rosety 21 August 2018 в 18:44
поделиться
$<?
$db = sqlite_open('mysqlitedb');
$cols = sqlite_fetch_column_types('form name'$db, SQLITE_ASSOC);
foreach ($cols as $column => $type) {
  echo "Column: $column  Type: $type\n";
}
0
ответ дан Nigel Alderton 21 August 2018 в 18:44
поделиться
  • 1
    Не просто отправляйте код, а также объясняйте, почему и как он работает. – Chad 9 November 2012 в 22:55
Другие вопросы по тегам:

Похожие вопросы: