Переменная self.indexes
не будет заполнена после цикла запросами. Запросы даже не выполняются там.
Если вы не хотите использовать общий экспорт в файл, вы можете поместить запись в файл, чтобы функционировать при закрытии паука. Подробности здесь: scrapy: вызов функции, когда паук выходит
. Вам нужно привязать сигнал к функции и написать там код.
В других структурах абстракции БД на других языках его можно использовать для таких вещей, как выполнение правильного экранирования для встроенных значений (для драйверов, которые не поддерживают правильные параметры привязки) и повышение эффективности сети путем обеспечения надлежащей двоичной упаковки чисел (при условии поддержки протокола). Похоже, что в PDO это мало что делает.
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
char *p;
int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
ZVAL_STRINGL(param->parameter, p, len, 0);
} else {
convert_to_string(param->parameter);
}
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
convert_to_boolean(param->parameter);
}
Итак, если вы говорите, что это STR (или если вы вообще ничего не говорите, поскольку это значение по умолчанию), а внутренний тип ваших данных - double, то он будет превратите его в строку с помощью одного метода, если это не double, то он преобразует его в строку, используя другой метод.
Если вы скажете, что это int, но на самом деле это bool, тогда он преобразует его в длинный .
Если вы так говорите ' sa bool, но на самом деле это число, тогда оно преобразует его в истинное логическое значение.
Это действительно все, что я увидел (быстро), глядя на исходный код stmt, я полагаю, как только вы передадите параметры в драйвер, они смогут творить дополнительную магию , Итак, я предполагаю, что все, что вы получаете, - это немного правильного поведения и много неоднозначного поведения и различий между водителями.
There's at least one effect PDO::PARAM_INT has on INSERT queries: boolean values are converted to 0 or 1. Like in
$i = true;
$stmt->bindParam(':i', $v, PDO::PARAM_INT);
pdo_stmt.c:
else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) { convert_to_long(param->parameter); }
Итак, я решил погрузиться в исходный код PHP, и вот что я нашел.
static int really_register_bound_param
в ext / pdo / pdo_stmt.c в строке 329 версии 5.2.9
if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_STR && param->max_value_len <= 0 && ! ZVAL_IS_NULL(param->parameter)) {
if (Z_TYPE_P(param->parameter) == IS_DOUBLE) {
char *p;
int len = spprintf(&p, 0, "%F", Z_DVAL_P(param->parameter));
ZVAL_STRINGL(param->parameter, p, len, 0);
} else {
convert_to_string(param->parameter);
}
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_INT && Z_TYPE_P(param->parameter) == IS_BOOL) {
convert_to_long(param->parameter);
} else if (PDO_PARAM_TYPE(param->param_type) == PDO_PARAM_BOOL && Z_TYPE_P(param->parameter) == IS_LONG) {
convert_to_boolean(param->parameter);
}
Это преобразования, которые PDO выполняет во время привязки.
Вот и все. Больше ничего не конвертируется. PDO использует флаги PARAM для форматирования SQL, чтобы не приводить типы данных.
Я попробовал то же самое с BindValue и получил тот же результат, поэтому поведение, которое вы видите, не ограничивается bindParam.
$stmt->BindValue(':marque', $marque) ;
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;
$stmt->execute();
$nom = '250 GTO';
$stmt->BindValue(':nom', $nom, PDO::PARAM_INT) ;
$stmt->execute();