ΠΡΠΈΠ²Π΅Ρ,
ΠΠ°ΠΊ ΠΌΡ ΠΌΠΎΠΆΠ΅ΠΌ ΡΠ΅Π°Π»ΠΈΠ·ΠΎΠ²Π°ΡΡ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡ Π² Π΄Π²ΡΡ
ΡΠ°Π·Π½ΡΡ
ΡΡ
Π΅ΠΌΠ°Ρ
, Π½ΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΠΈ ΡΠΎΠΉ ΠΆΠ΅ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
.
Π’Π΅Ρ
Π½ΠΈΡΠ΅ΡΠΊΠΈ ΡΡ
Π΅ΠΌΡ β ΡΡΠΎ ΠΏΡΠΎΡΡΠΎ Π»ΠΎΠ³ΠΈΡΠ΅ΡΠΊΠΎΠ΅ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΡΠ°Π±Π»ΠΈΡ Π² ΠΎΠ΄Π½ΠΎΠΉ Π±Π°Π·Π΅ Π΄Π°Π½Π½ΡΡ
, ΠΏΠΎΡΡΠΎΠΌΡ ΠΏΡΠΈ Π½Π°ΠΏΠΈΡΠ°Π½ΠΈΠΈ SQL-Π·Π°ΠΏΡΠΎΡΠ° Π²ΡΠ΅, ΡΡΠΎ Π½Π°ΠΌ Π½ΡΠΆΠ½ΠΎ, ΡΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΡΡ ΠΊ Π½ΠΈΠΌ ΠΏΡΠ΅ΡΠΈΠΊΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΡ
Π΅ΠΌΡ.
ΠΠ°ΠΏΡΠΈΠΌΠ΅Ρ,
select *
from user_schema.users as users
inner join account_schema.accounts as accounts
on users.users.id = accounts.user_id
Π― ΠΌΠΎΠ³ Π±Ρ, Π½Π°Π²Π΅ΡΠ½ΠΎΠ΅, Π½Π°ΠΏΠΈΡΠ°ΡΡ Π½ΠΈΠΆΠ΅ kenx.js. ΠΡΠΎ Π²ΡΠ³Π»ΡΠ΄ΠΈΡ Ρ ΠΎΡΠΎΡΠΎ?
knex.from('user_schema.users as users').innerJoin('account_schema.accounts as accounts',
'users.id', 'accounts.user_id')
ΠΠΎ ΠΏΠΎΡΠΎΠΌ Ρ ΡΠ²ΠΈΠ΄Π΅Π». ΠΠ°ΡΠ°ΠΌΠ΅ΡΡ withSchema
Ρ knex.js Π ΡΠ΅ΠΌ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ²ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ ΡΡΠΎΠ³ΠΎ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠ° Π²ΠΌΠ΅ΡΡΠΎ ΠΏΡΠ΅ΡΠΈΠΊΡΠ° ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΡ ΡΠΎ ΡΡ
Π΅ΠΌΠΎΠΉ. ΠΠ°ΠΊ Ρ ΠΌΠΎΠ³Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ ΠΎΠΏΡΠΈΡ .withSchema
Π΄Π»Ρ ΠΎΠ±ΡΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΡΠ°Π±Π»ΠΈΡ ΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΡ ΠΈΠ· Π΄Π²ΡΡ
ΡΠ°Π·Π½ΡΡ
ΡΡ
Π΅ΠΌ?
Knex.js Documentation
------------------------
.withSchema([schemaName])
Specifies the schema to be used as prefix of table name.
knex.withSchema('public').select('*').from('users')
Outputs:
select * from `public`.`users`
Π»ΡΠ±ΠΎΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΠ΅ Π΄Π»Ρ ΡΡΠΎΠ³ΠΎ?
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°, Ρ. Π΅. ΠΈΠΌΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΈΠΌΡ ΡΡΠΎΠ»Π±ΡΠ°, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° ΡΡ Π΅ΠΌΡ, ΠΏΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅ schemaName.tableName, Π·Π°ΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ .withSchema('schemaName')
.
ΠΠΎ Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ .withSchema
ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡ
Π΅ΠΌΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊΠ°.
ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ:
ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ .withSchema
Π²ΠΎΠΎΠ±ΡΠ΅ Π² Π·Π°ΠΏΡΠΎΡΠ΅ speasure, Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΈΠΌΡ ΡΡ
Π΅ΠΌΡ Π² ΡΡΡΠΎΠΊΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΡ.
ΠΡΠΎ ΠΏΡΠΎΡΠΈΠ² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡ Ρ .withSchema
{
let rows = await knex.withSchema("sandbox1")
.select('first_name', 'last_name', 'phone', 'site', "sites.name as sname")
.from('users')
.leftJoin(
knex.withSchema('public')
.table('sites')
.select()
.as("sites"),
"sites.id",
"users.site")
console.log(rows)
}
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ .as
Π² ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ΅.
.joinRaw()
{
let queryBuilder = knex.withSchema("sandbox1")
.select('first_name', 'last_name', 'phone', 'site', "sites.name as sname")
.from('users')
.joinRaw("left join public.sites as sites ON sites.id = users.site", [])
let sql = queryBuilder.toSQL().toNative()
let rows = await queryBuilder
console.log((sql))
console.log(rows)
}
.raw()
{
let { rows ,rowCount } = await knex
.raw('SELECT users.first_name, users.last_name, users.phone, users.site, sites.name as sname FROM sandbox1.users, public.sites WHERE sites.id = users.site;');
console.log(rows)
}
ΠΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ knex.
ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ.
ΠΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΅ΡΠ΅ ΠΎΠ΄Π½ΠΎΠΉ Π΄Π΅ΡΠ°Π»ΠΈ ΠΊ ΠΎΡΠ²Π΅ΡΡ @codinggirl :
ΠΡΠΏΠΎΠ»ΡΠ·ΡΡ joinRaw() , Π²Ρ ΠΌΠΎΠΆΠ΅ΡΠ΅ ΠΏΡΠΈΠ²ΡΠ·Π°ΡΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ. ΠΠΎΡΠΎΡΡΠΉ Π³Π΅Π½Π΅ΡΠΈΡΡΠ΅Ρ Π·Π°ΠΏΡΠΎΡ Ρ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΡΠΌ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡΠΎΠΌ Π²ΠΎ Π²ΡΠ΅ΠΌ Π·Π°ΠΏΡΠΎΡΠ΅.
{
const queryBuilder = knex.withSchema("sandbox1")
.select('first_name', 'last_name', 'phone', 'site', "sites.name as sname")
.from('users')
.joinRaw("left join ?? ON ?? = ??", ["public.sites", "sites.id", "users.site"])
const sql = queryBuilder.toString()
console.log(sql)
}
ΠΡΠΈΠΌΠ΅ΡΠ°Π½ΠΈΠ΅. ΠΠΎΠ·ΠΈΡΠΈΠΎΠ½Π½ΡΠ΅ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ? ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ Π·Π½Π°ΡΠ΅Π½ΠΈΡ ΠΈ ?? ΠΈΠ½ΡΠ΅ΡΠΏΡΠ΅ΡΠΈΡΡΡΡΡΡ ΠΊΠ°ΠΊ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΡ.
ΠΡΠ²ΠΎΠ΄ Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°ΠΌΠΈ Π½Π° PG:
Π²ΡΠ±Π΅ΡΠΈΡΠ΅ "first_name", "last_name", "phone", "site", "sites"."name" ΠΊΠ°ΠΊ "sname" ΠΈΠ· "sandbox1"."users" ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ "public"."sites" ON "sites". "id" = "ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ"."ΡΠ°ΠΉΡ"
ΠΡΠ²ΠΎΠ΄ Ρ ΠΏΡΠΈΠ²ΡΠ·ΠΊΠ°ΠΌΠΈ Π½Π° MSSQL:
Π²ΡΠ±Π΅ΡΠΈΡΠ΅ [ΠΈΠΌΡ], [ΡΠ°ΠΌΠΈΠ»ΠΈΡ], [ΡΠ΅Π»Π΅ΡΠΎΠ½], [ΡΠ°ΠΉΡ], [ΡΠ°ΠΉΡΡ].[ΠΈΠΌΡ] ΠΊΠ°ΠΊ [ΠΈΠΌΡ] ΠΈΠ· [ΠΏΠ΅ΡΠΎΡΠ½ΠΈΡΡ1].[ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ] ΠΎΡΡΠ°Π²ΠΈΠ»ΠΈ ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½Π΅Π½ΠΈΠ΅ [ΠΎΠ±ΡΠ΅Π΄ΠΎΡΡΡΠΏΠ½ΠΎΠ΅].[ΡΠ°ΠΉΡΡ] ΠΠΠ [ΡΠ°ΠΉΡΡ]. [id] = [ΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΠ΅Π»ΠΈ].[ΡΠ°ΠΉΡ]
ΠΠ΅ΠΆΠ΄Ρ ΡΠ΅ΠΌ, Π±Π΅Π· ΠΏΡΠΈΠ²ΡΠ·ΠΊΠΈ ΠΎΠ½ Π²ΡΠ΅Π³Π΄Π° Π±ΡΠ΄Π΅Ρ Π³Π΅Π½Π΅ΡΠΈΡΠΎΠ²Π°ΡΡ:
Π²ΡΠ±Π΅ΡΠΈΡΠ΅ "first_name", "last_name", "phone", "site", "sites"."name" ΠΊΠ°ΠΊ "sname" ΠΈΠ· "sandbox1"."users" ΠΎΡΡΠ°Π²ΠΈΠ» ΠΏΡΠΈΡΠΎΠ΅Π΄ΠΈΠ½ΠΈΡΡΡΡ ΠΊ public.sites ON site.id = users.site
Π‘Π°ΠΌΡΠΉ ΠΏΠΎΠ»Π΅Π·Π½ΡΠΉ ΠΊΠΎΠΌΠΌΠ΅Π½ΡΠ°ΡΠΈΠΉ
Π Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΡΡΡ, ΡΡΠΎ ΡΠΈΠ½ΡΠ°ΠΊΡΠΈΡ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡΠ°, Ρ. Π΅. ΠΈΠΌΡ ΡΠ°Π±Π»ΠΈΡΡ, ΠΈΠΌΡ ΡΡΠΎΠ»Π±ΡΠ°, Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅ΡΡΠ° Π΄Π»Ρ Π²ΡΠ±ΠΎΡΠ° ΡΡ Π΅ΠΌΡ, ΠΏΠΎΡΡΠΎΠΌΡ, Π΅ΡΠ»ΠΈ Π²Ρ Π²ΡΠΏΠΎΠ»Π½ΡΠ΅ΡΠ΅ schemaName.tableName, Π·Π°ΠΏΡΠΎΡ ΠΌΠΎΠΆΠ΅Ρ ΠΎΡΠΎΠ±ΡΠ°ΠΆΠ°ΡΡΡΡ Π½Π΅ΠΏΡΠ°Π²ΠΈΠ»ΡΠ½ΠΎ.
ΠΠΌΠ΅ΡΡΠΎ ΡΡΠΎΠ³ΠΎ Π±ΡΠ»ΠΎ ΠΏΡΠ΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
.withSchema('schemaName')
.ΠΠΎ Ρ ΠΎΠ±Π½Π°ΡΡΠΆΠΈΠ», ΡΡΠΎ
.withSchema
ΡΠ°Π±ΠΎΡΠ°ΡΡ ΡΠΎΠ»ΡΠΊΠΎ Π² ΠΎΠ΄Π½ΠΎΠΉ ΡΡ Π΅ΠΌΠ΅ Π²ΠΎ Π²ΡΠ΅ΠΌ Π±Π»ΠΎΠΊΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½ΠΎΠ²ΡΠΈΠΊΠ°.ΠΠ° Π΄Π°Π½Π½ΡΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ Ρ ΠΌΠ΅Π½Ρ Π΅ΡΡΡ ΡΠ»Π΅Π΄ΡΡΡΠΈΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π½ΡΠ΅ ΡΠ΅ΡΠ΅Π½ΠΈΡ:
ΠΠ΅ ΠΈΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅
.withSchema
Π²ΠΎΠΎΠ±ΡΠ΅ Π² Π·Π°ΠΏΡΠΎΡΠ΅ speasure, Π²ΠΊΠ»ΡΡΠΈΡΠ΅ ΠΈΠΌΡ ΡΡ Π΅ΠΌΡ Π² ΡΡΡΠΎΠΊΡ ΠΈΠΌΠ΅Π½ΠΈ ΡΠ°Π±Π»ΠΈΡΡ.ΠΡΠΎ ΠΏΡΠΎΡΠΈΠ² Π΄ΠΎΠΊΡΠΌΠ΅Π½ΡΠ°.
ΠΡΠΏΠΎΠ»ΡΠ·ΡΠΉΡΠ΅ ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡ Ρ
.withSchema
Π’Π°ΠΊΠΈΠΌ ΠΎΠ±ΡΠ°Π·ΠΎΠΌ, Π½ΡΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°ΡΡ
.as
Π² ΠΏΠΎΠ΄Π·Π°ΠΏΡΠΎΡΠ΅..joinRaw()
.raw()
ΠΡΠΎ ΠΈΠΌΠ΅Π΅Ρ ΠΌΠ΅Π½ΡΡΠ΅ ΠΏΡΠ΅ΠΈΠΌΡΡΠ΅ΡΡΠ² Π΄Π»Ρ ΠΈΡΠΏΠΎΠ»ΡΠ·ΠΎΠ²Π°Π½ΠΈΡ knex.
ΠΠΊΠΎΠ½ΡΠ°ΡΠ΅Π»ΡΠ½Π°Ρ ΠΌΠΎΡΠ½ΠΎΡΡΡ.