node.js - Typeorm birden fazla veritabanına bağlanmak
Back-end proje için node.js, TS ve typeorm kullanıyorum.
Gönderdiğim parametreye göre middleware'de farklı bir veritabanına bağlanmam gerekiyor. Ve sorguyu veritabanına göndermem lazım.
ormconfig
[
{
"name": "default",
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "12345",
"database": "dbOne"
},
{
"name": "second-connection",
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "12345",
"database": "dbTwo"
}
]
Bunlar benim bağlantı ayarlarım. Bunu yaptıktan sonra, ara yazılıma bağlanmaya çalışıyorum.
const connectionOptions = await getConnectionOptions("second-connection");
const conTwo = await createConnection(connectionOptions);
const managerTwo = getManager("second-connection");
const resultTwo = await managerTwo
.createQueryBuilder(SysCompany, "company")
.getOne();
console.log(resultTwo);
Bence veritabanına bağlanabilirim, ama depo ile ilgili sorun yaşıyorum.
Hata
EntityMetadataNotFound: "SysCompany" için herhangi bir meta veri bulunamadı.
@Entity()
export class SysCompany extends CoreEntityWithTimestamp {
@Column({ length: 100 })
name: string;
// FK
// SysPersonnel
@OneToMany(type => SysPersonnel, personnel => personnel.sysCompany)
sysPersonnels: SysPersonnel[];
}
Cevap #1
Belki typeORM JavaScript varlığınızı bulamıyor. Bir süre önce benim de başıma böyle bir şey gelmişti. Şunu yapabilirsiniz:
- Projeyi derledikten sonra hedef klasörünüzü kontrol edin.
SysCompany.jsmevcut mu? - Yapılandırmada
entitiesözelliğini ayarlayın. JS varlıklarınızın yolunu içermelidir. typeORM dokümanları, "Her bir varlık bağlantı seçeneklerinizde kayıtlı olmalıdır" diyor.
{
"name": "second-connection",
"type": "postgres",
"host": "localhost",
"port": 5432,
"username": "postgres",
"password": "12345",
"database": "dbTwo"
"entities": ["<path to entities>/**/*.js"]
}
Ayrıca bir JavaScript yapılandırma dosyası kullanmanızı da tavsiye ederim. ormconfig.js dosyanız daha sonra yolu ayarlamak için __dirname (mevcut modülün dizin adı) kullanabilir. Bu yüzden dizinleriniz şöyle görünüyorsa:
project/ormconfig.js
project/dist/entity/SysCompany.js
project/dist/entity/OtherEntity.js
Böyle bir yapılandırma kullanabilirsiniz:
import {join} from "path";
...
entities: [
join(__dirname, "dist/entity/**/*.js")
],
...
Ayrıca bir temel yapılandırma nesnesi kullanarak çoğaltmayı önleyebilirsiniz.
import {join} from "path";
const baseOptions = {
type: "postgres",
host: "localhost",
port: 5432,
username: "postgres",
password: "12345",
entities: [
join(__dirname, "dist/entity/**/*.js")
]
}
const defaultConfig = Object.assign({
name: "default",
database: "dbOne",
}, baseOptions);
const secondConfig = Object.assign({
name: "second-connection",
database: "dbTwo",
}, baseOptions);
module.exports = [ defaultConfig, secondConfig ];
Bağlantıyı açtığınız dosyada bir import kullanabilirsiniz:
import { secondConfig } from "<path to file>/ormconfig";
const conTwo = await createConnection(secondConfig);
Cevap #2
Birden fazla veritabanı kullanmanın en basit yolu, farklı bağlantılar oluşturmaktır:
import {createConnections} from "typeorm";
const connections = await createConnections([{
name: "db1Connection",
type: "mysql",
host: "localhost",
port: 3306,
username: "root",
password: "admin",
database: "db1",
entities: [__dirname + "/entity/*{.js,.ts}"],
synchronize: true
}, {
name: "db2Connection",
type: "mysql",
host: "localhost",
port: 3306,
username: "root",
password: "admin",
database: "db2",
entities: [__dirname + "/entity/*{.js,.ts}"],
synchronize: true
}]);
Bu yaklaşım, sahip olduğunuz herhangi bir veritabanına bağlanmanıza olanak tanır ve her veritabanının kendi yapılandırması, kendi varlıkları ve genel ORM kapsamı ile ayarları olur. Her bağlantı için yeni bir Connection örneği oluşturulacaktır. Oluşturduğunuz her bağlantı için benzersiz bir ad belirtmeniz gerekir. Bağlantı seçenekleri ayrıca bir ormconfig dosyasından da yüklenebilir. Tüm bağlantıları ormconfig dosyasından yükleyebilirsiniz:
import {createConnections} from "typeorm";
const connections = await createConnections();
veya hangi bağlantının oluşturulacağını isimle belirtebilirsiniz:
import {createConnection} from "typeorm";
const connection = await createConnection("db2Connection");
Bağlantılarla çalışırken belirli bir bağlantıyı almak için bir bağlantı adı belirtmelisiniz:
import {getConnection} from "typeorm";
const db1Connection = getConnection("db1Connection");
// you can work with "db1" database now...
const db2Connection = getConnection("db2Connection");
// you can work with "db2" database now...
Bu yaklaşımın kullanılmasının avantajı, farklı giriş bilgileri, sunucu, port ve hatta veritabanı türü ile birden çok bağlantıyı yapılandırabilmenizdir. Dezavantajı ise birden çok bağlantı örneğini yönetmeniz ve onlarla çalışmanız gerekebilir.
