جاوااسکریپت - تایپاورم چگونه به دیتابیسهای مختلف بنویسیم؟
من در حال تلاش هستم که یک جدول در یک پایگاه داده و جدول دیگری در پایگاه داده دیگر ایجاد کنم. برای اینکه این کار انجام شود، دو موجودیت وجود دارند که با استفاده از دکوراتور @Entity به پایگاه داده صحیح اشاره میکنند. مشکل این است که typeorm یا بهتر بگوییم SQL خطایی میدهد که کاربر x نمیتواند در پایگاه داده y بنویسد.
چگونه باید با پایگاههای داده مختلف به درستی برخورد کرد؟
// src/entity/User.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity({database: 'db1'})
export class User {
@PrimaryGeneratedColumn()
id: number
@Column()
mame: string
}
// src/entity/Movie.ts
import { Entity, PrimaryGeneratedColumn, Column } from 'typeorm'
@Entity({database: 'db2'})
export class Movie {
@PrimaryGeneratedColumn()
id: number
@Column()
title: string
}
ارتباطات با مدارک معتبر خود ایجاد میشوند:
// src/index.ts
await createConnection({
name: 'connection1',
host: 'SERVER1',
username: 'bob',
password: 'xxx',
type: 'mssql',
database: 'db1',
synchronize: true,
entities: ['src/entity/**/*.ts'],
migrations: ['src/migration/**/*.ts'],
subscribers: ['src/subscriber/**/*.ts'],
cli: {
entitiesDir: 'src/entity',
migrationsDir: 'src/migration',
subscribersDir: 'src/subscriber',
},
})
await createConnection({
name: 'connection2',
host: 'SERVER2',
username: 'mike',
password: 'xxx',
type: 'mssql',
database: 'db2',
synchronize: true,
entities: ['src/entity/**/*.ts'],
migrations: ['src/migration/**/*.ts'],
subscribers: ['src/subscriber/**/*.ts'],
cli: {
entitiesDir: 'src/entity',
migrationsDir: 'src/migration',
subscribersDir: 'src/subscriber',
},
})
ما واقعاً نیاز داریم که با دکوراتورها کار کنیم زیرا ما همچنین از دکوراتورهای type-graphql در کلاس استفاده میکنیم. نکته خندهدار این است که وقتی دکوراتور برای موجودیت خالی گذاشته میشود، هر دو جدول در هر دو پایگاه داده ایجاد میشوند. بنابراین اطلاعات ورود درست هستند.
من یک مشکل مشابه را اینجا پیدا کردم و اینجا درخواست کمک کردم.
از کمک شما متشکرم.
پاسخ شماره ۱
من خودم این یکی را با کمک نظرات @Aluan فهمیدم. بنابراین این مراحل برای هر کسی که با این مشکل مواجه شده است، اینجا هستند:
- آرایه
entitiesرا بهگونهای تغییر دهید که هر اتصال/پایگاه داده پوشه مخصوص به خود با فایلهای موجودیت داشته باشد و اتصال پرکاربرد خود راdefaultنامگذاری کنید:
// src/index.ts
await createConnections([
{
name: 'default',
host: 'SERVER1',
username: 'bob',
password: 'kiwi',
type: 'mssql',
database: 'db1',
...
"synchronize": true,
"entities": ["src/db1/entity/**/*.ts"],
},
{
name: 'connection2',
host: 'SERVER2',
username: 'Mike',
password: 'carrot',
type: 'mssql',
database: 'db2',
...
"synchronize": true,
"entities": ["src/db2/entity/**/*.ts"],
])
برای هر پایگاه داده فایلهای موجودیت را در پوشه مربوطه آن ایجاد کنید:
src/db1/entity/Fruit.ts> جدول در db1
src/db2/entity/Vegetables.ts> جدول در db2
با "synchronize": true هر جدول بهطور خودکار در پایگاه داده درست ایجاد خواهد شد
- دسترسی به دادهها در جداول:
- برای اتصال
default::
import { Fruit } from 'src/db1/entity/Fruit'
fruits() {
return Fruit.find()
}
- برای اتصال غیر پیشفرض:
import { getRepository } from 'typeorm'
import { Vegetable } from 'src/db2/entity/Vegetable'
vegetables() {
return async () => await getRepository(Vegetable).find()
}
یا
async vegetables() {
return await getRepository(vegetables, 'connection2').find()
}
امیدوارم این به کسی دیگر که با همان مشکلاتی که من داشتم دست و پنجه نرم میکند کمک کند.
