Pergunta

Eu estive pensando se há algum código lá fora, que permite representando SQL na forma de alguma árvore de objetos que podem ser montados, modificados e, finalmente, processado para SQL válido?

Em cima da minha cabeça que poderia ser algo como isso ...

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

Este é apenas um exemplo e a coisa lá fora, pode trabalhar totalmente diferente, mas sim, eu adoraria ouvir o que está fora tere a esse respeito.

UPDATE:

Estou ciente das inúmeras possibilidades de utilização de tecnologias de ORM para obter os meus resultados do DB, mas eu estava depois de um modelo para o próprio SQL. Eu sei que o nível de abstração é muito baixo, mas que poderia permitir uma situação onde vários colaboradores podem trabalhar em uma instrução SQL (várias associações, vários wheres), que, em seguida, pode ser "traduzida" no final do build-Phase.

Foi útil?

Solução

O SQLAlchemy pacote python tem uma camada ORM, mas também tem uma camada de geração de SQL.

[Eu percebo você marcou este post C # e .NET, mas eu pensei que você gostaria de ver o que mais está lá fora]

Aqui está um exemplo de código:

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.

Normalmente, você deve executar a instrução usando SQLAlchemy se conectar a um banco de dados. Então você pode fazer:

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

Espero que isso ajude.

Outras dicas

O Hibernate tem seu próprio Hibernate Query Language (HQL) que representa SQL-like construções como objetos.

Um OR-Mapper, como do Microsoft LINQ

Aqui estão alguns exemplos:

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;

Alguns links para você começar:

Veja o exposto, e eu já vi mais de uma cabeça programador por este caminho. (E eu já disse mais de uma programador que eu já vi mais de um programador ..., mas normalmente eles acabam descobrindo por conta própria o quão bem ele funciona.)

A dificuldade que vejo é que você está adicionando complexidade substancial sem oferecer muito em termos de abstração. Você praticamente necessidade de saber o SQL você vai ser acabar com qualquer maneira.

(Pelo menos na medida em que o padrão está representada em sua ilustração, onde você está especificando as cláusulas diretamente. ORMs bem abstrato além disso.)

Você pode tentar MetaDb . Há algum trabalho feito. consulta Amostra http://i3.codeplex.com/Project/ download / FileDownload.aspx? ProjectName = metadb & downloadId = 11482

Mas, se você pode usar o .NET 3.5, você pode usar LINQ.

Na Net, Linq faz muito bem o que você está falando.

Se você ainda está usando .NET 2.0 e não se moveram em diante para LINQ, então gostaria de criar uma classe da instrução de base, em seguida, criar classes que permitem um padrão de decorador.

Dessa forma, você pode simplesmente continuar a acrescentar o que você precisa para a sua declaração de base.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top