postgresql - هل هناك أي طريقة لربط معلمة في قسم select لـ TypeORM؟
أنا أحاول تنفيذ البحث باستخدام وحدة pg_trgm في PostgreSQL على مشروع مكتوب بـ TypeScript و TypeOrm. SQL الذي يعمل بالنسبة لي يبدو هكذا:
SELECT t, similarity(t, 'word') AS sml
FROM test_trgm
WHERE t % 'word'
ORDER BY sml DESC, t;
ولكن عندما بدأت في دمجه في منشئي أدركت أنني لا أستطيع حماية جملة الاختيار من حقن SQL لأن TypeOrm لا يوفر ربط المعلمات في أي من طرق الاختيار (مثل SelectQueryBuilder::addSelect، SelectQueryBuilder::select).
مثال عن طريقتي الضعيفة:
...
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, ${needle})`);
builder.andWhere('title % :needle', { needle });
}
}
...
ربما يعرف شخص ما طريقة أفضل لتنفيذ هذا البحث في مجموعة تقنياتي؟
الإجابة رقم 1
كنت بحاجة إلى حل مشابه، ومع ذلك فإن حلك لن ينفع بالنسبة لي. إذا كنت ترغب في تغيير معاملتك في الـ select على أي حال، يجب أن تنظر إلى setParameter، وهو ما يقوم به المعامل الثاني من addWhere داخليًا.
https://github.com/typeorm/typeorm/blob/master/docs/select-query-builder.md#using-parameters-to-escape-data
لذلك في حالتك كان بإمكانك الركض مع
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :title)`);
builder.andWhere('title % :needle', { needle });
builder.setParameter('title', needle);
}
}
الإجابة رقم 2
تم اتخاذ قرار هذه القضية باستخدام نفس مفتاح الربط في تعليمات where وselect بالطريقة التالية.
applySearch(builder: SelectQueryBuilder<any>, needle: string) {
if (needle) {
builder.addSelect(`similarity(title, :needle)`);
builder.andWhere('title % :needle', { needle });
}
}
