Frage

Ich habe mich gefragt, ob es einen Code aus, dass es in der Form eines Objekts Baum darstellt SQL ermöglicht, die zusammengebaut werden können, modifiziert und dann schließlich auf gültige SQL gemacht?

Aus der Spitze von meinem Kopf könnte es so ähnlich aussehen ...

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

Dies ist nur ein Beispiel und die Sache kann es aus völlig anders funktionieren, aber ja, ich würde gerne hören, was Tere in dieser Hinsicht ist aus.

UPDATE:

Ich bin mir bewusst, der zahlreichen Möglichkeiten der ORM-Technologien meine Ergebnisse aus der DB zu bekommen, aber ich war nach einem Modell für die SQL selbst. Ich weiß, dass das Niveau der Abstraktion recht niedrig ist, aber es könnte möglicherweise eine Situation zulassen, in der mehr Mitarbeiter auf einer SQL-Anweisung arbeiten können (mehrere beitritt, mehrere wheres), die dann am Ende der Build-Phase „gemacht“ werden können.

War es hilfreich?

Lösung

Das Python-Paket SQLAlchemy hat eine ORM-Schicht, aber es hat auch eine SQL-Erzeugungsschicht.

[Ich weiß, Sie diesen Beitrag c # markiert und .net, aber ich dachte, Dich zu sehen, was es sonst noch gibt]

Hier ist ein Beispiel-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.

Normalerweise würden Sie die Anweisung auszuführen durch SQLAlchemy mit einer Datenbank zu verbinden. Dann können Sie tun:

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

Hope, das hilft.

Andere Tipps

Hibernate hat seine eigene Hibernate Query Language (HQL), die SQL-ähnliche Konstrukte als Objekte darstellt.

Ein OR-Mapper, wie Microsofts LINQ

Hier sind einige Beispiele:

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;

Einige Links zum Einstieg:

Siehe oben, und ich habe auf diesem Weg mehr als einen Programmierer Kopf gesehen. (Und ich habe gesagt, mehr als ein Programmierer, dass ich mehr als ein Programmierer gesehen haben ..., aber in der Regel landen sie auf ihre eigenen, herauszufinden, wie gut es funktioniert.)

Die Schwierigkeit, die ich sehe, ist, dass Sie erhebliche Komplexität hinzufügen, ohne viel im Weg der Abstraktion an. Sie müssen ziemlich viel wissen, was SQL Sie sowieso enden werden.

(zumindest in dem Maße, dass das Muster wie in der Abbildung dargestellt ist, wo Sie die Klauseln direkt sind angeben. ORMs abstrakt weit darüber hinaus.)

Sie können versuchen, MetaDB . Es ist eine Arbeit erledigt. Beispielabfrage http://i3.codeplex.com/Project/ Download / FileDownload.aspx? Projektname = metadb & DOWNLOADID = 11482

Aber wenn Sie .NET 3.5 verwenden, können Sie LINQ verwenden.

In .Net, Linq macht ziemlich genau, was du redest.

Wenn Sie immer noch .NET 2.0 und haben sie nicht bewegt weiter zu LINQ verwenden, dann würde ich eine Basisanweisung Klasse erstellen, dann Klassen erstellen, die für ein Dekorateur Muster ermöglichen.

So kann man nur halten können hinzugefügt, was Sie an Ihrer Basis Erklärung benötigen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top