Question

Je me demandais s'il existait un code permettant de représenter le code SQL sous la forme d'une arborescence d'objets pouvant être assemblée, modifiée puis finalement convertie en code SQL valide?

Cela pourrait bien ressembler à quelque chose comme ça ...

var stmnt = new Statement();
stmnt
  .AddMaster("Customer")
  .Show("Firstname, "Lastname")
  .AddJoin("Address", "ID", "CustomerID")
  .Show("Street", "City");
stmnt.WhereStatement()
  .AddParameter("Address.City", Op.Equal);

string sql = stmnt.Generate();
// select a.FirstName, a.LastName, b.Street, b.City
// from Customer a
// join Address b on b.CustomerID = a.ID
// where b.City = :p1

Ceci est juste un exemple et la chose là-bas peut fonctionner de manière totalement différente, mais oui, j'aimerais entendre ce qui se passe à cet égard.

MISE À JOUR:

Je suis conscient des nombreuses possibilités d'utilisation des technologies ORM pour obtenir mes résultats de la base de données, mais je cherchais un modèle pour le code SQL lui-même. Je sais que le niveau d'abstraction est assez faible, mais cela pourrait éventuellement permettre à plusieurs collaborateurs de travailler sur une instruction SQL (plusieurs jointures, plusieurs occurrences) pouvant ensuite être & Quot; rendue & Quot; à la fin de la phase de construction.

Était-ce utile?

La solution

Le paquet python SQLAlchemy a une couche ORM, mais il a aussi une couche de génération SQL.

[Je réalise que vous avez tagué ce post c # et .net, mais je pensais que vous aimeriez peut-être voir ce qu'il y a d'autre là-bas]

Voici un exemple de code:

from sqlalchemy import Table, Column, Integer, String, MetaData, ForeignKey
from sqlalchemy.sql import select

metadata = MetaData()

# Make a basic customer table.
Customer = Table('Customer',
                 metadata,
                 Column('ID', Integer, primary_key=True),
                 Column('FirstName', String),
                 Column('LastName', String))

# Make a basic address table
Address = Table('Address',
                metadata,
                Column('ID', Integer, primary_key=True),
                Column('City', String),
                Column('Street', String),
                Column('CustomerID', None, ForeignKey('Customer.ID')))


# Generate some sql
stmt = select([Customer.c.FirstName,
               Customer.c.LastName,
               Address.c.Street,
               Address.c.City],
              from_obj=Customer.join(Address),
              whereclause=Address.c.City == 'Wellington')

# Display
print stmt
# output:
SELECT "Customer"."FirstName", "Customer"."LastName", "Address"."Street", "Address"."City" 
FROM "Customer" JOIN "Address" ON "Customer"."ID" = "Address"."CustomerID" 
WHERE "Address"."City" = :City_1

# note that SQLAlchemy picked up the join condition from the foreign key.
# you can specify other join conditions if you want.

En règle générale, vous exécuteriez l'instruction à l'aide de SQLAlchemy pour vous connecter à une base de données. Ensuite, vous pouvez faire:

for row in stmt.execute():
    print 'Name:', row.c.FirstName, row.c.LastName, 'City:', row.c.City

J'espère que cela vous aidera.

Autres conseils

Hibernate a son propre langage HQL (Hibernate Query Language) qui représente les constructions de type SQL sous forme d’objets.

Un OR-Mapper, tel que le LINQ

Voici quelques exemples:

from c in customers
where c.LastName.StartsWith("A")
select c

//

var q = from c in db.Contact
           where c.DateOfBirth.AddYears(35) > DateTime.Now
           orderby c.DateOfBirth descending
           select c;

Quelques liens pour vous aider à démarrer:

Voir ce qui précède et j'ai déjà vu plus d'un programmeur s'engager dans cette voie. (Et j'ai dit à plus d'un programmeur que j'avais vu plus d'un programmeur ..., mais généralement, ils finissent par découvrir par eux-mêmes à quel point cela fonctionne.)

Le problème que je vois, c’est que vous ajoutez une complexité substantielle sans offrir beaucoup d’abstraction. De toute façon, vous avez besoin de savoir quel code SQL vous allez utiliser.

(Au moins dans la mesure où le motif est tel que représenté dans votre illustration, où vous spécifiez directement les clauses. Les ORM sont abstraits bien au-delà.)

Vous pouvez essayer MetaDb . Il y a du travail fait. Exemple de requête http: //i3.codeplex. com / Projet / Télécharger / FileDownload.aspx? NomProjet = metadb & DownloadId = 11482

Mais si vous pouvez utiliser .NET 3.5, vous pouvez utiliser LINQ.

En .Net, Linq fait à peu près ce dont vous parlez.

Si vous utilisez toujours .NET 2.0 et que vous n'avez pas encore migré vers LINQ, je créerais une classe d'instructions de base, puis créerais des classes permettant un motif de décorateur.

Ainsi, vous pourrez continuer à ajouter ce dont vous avez besoin à votre déclaration de base.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top