ose-net / yesql.net

A class library for loading SQL statements from .sql files instead of writing SQL code in your C# source files
https://ose-net.github.io/yesql.net
MIT License
105 stars 3 forks source link

Support for multi database? #110

Closed mike7ang1rdz closed 8 months ago

mike7ang1rdz commented 10 months ago

Hi. I have a solution which Select the db engine depending on the environment... Is there a native configuration or db switch?

Thanks

MrDave1999 commented 10 months ago

Hello @mike7ang1rdz,

YeSQL.NET is not as such an ORM that allows support for multiple databases, however, there is a "trick" that can be applied to your situation. In your case, you need to create an abstraction layer that includes the repositories and each would have its own associated SQL file.

I will assume this is your project structure (is an example):

└── MyApp/
    ├── Contracts/
    │   ├── IUserRepository.cs
    │   └── IProductRepository.cs
    ├── Infrastructure/
    │   ├── SQLServer/
    │   │   ├── Users/
    │   │   │   ├── UserRepository.cs
    │   │   │   └── users.sql
    │   │   └── Products/
    │   │       ├── ProductRepository.cs
    │   │       └── products.sql
    │   └── SQLite/
    │       ├── Users/
    │       │   ├── UserRepository.cs
    │       │   └── users.sql
    │       └── Products/
    │           ├── ProductRepository.cs
    │           └── products.sql
    ├── Program.cs
    └── MyApp.csproj

The next step is to obtain the path where the SQL files are located depending on the name of the environment (if it is development or production), for example:

// This would go in Program.cs
// Obtain the environment name.
string environment = Environment.GetEnvironmentVariable("APP_ENVIRONMENT") ?? "Development";

// Obtain part of the route according to the environment.
string route = environment switch 
{
     "Development" => "Infrastructure/SQLite"
     "Production" => "Infrastructure/SQLServer",
      _ => throw new NotSupportedException("Unsupported environment");
};

// Prepare the complete route.
string[] paths = new[]
{
     Path.Combine(Directory.GetCurrentDirectory(), route)
};

// Load the SQL statements depending on the path previously obtained.
var loader = new YeSqlLoader();
ISqlCollection sqlCollection = loader.LoadFromDirectories(paths);

I'm not sure if your application is a web application, but if it is, Directory.GetCurrentDirectory() should return the root directory of the project (in this example it would be from MyApp/).

I hope you get the idea. This is the solution I can think of so far. Let me know if you have any questions.

MrDave1999 commented 8 months ago

Were you able to solve it? @mike7ang1rdz

mike7ang1rdz commented 8 months ago

thanks for your time nice approach