2009-02-02 8 views
1

조립, 수정 및 마지막으로 유효한 SQL로 렌더링 할 수있는 객체 트리 형태로 SQL을 표현할 수있는 코드가 있는지 궁금해하고 있습니다. 그것은 그런 일을 볼 수 있었다 내 머리 위로 떨어져SQL을 생성 할 OO 모델이 있습니까?

...

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 

이 그냥 예를 들어 거기에 완전히 다른 작동 할 수 있지만 그래, 내가 듣고 싶네요 밖으로 일 그 점에서 무엇이 밖으로 나오는지.

UPDATE :

나는 DB에서 내 결과를 얻을 수 ORM 기술을 사용하는 수많은 가능성을 알고,하지만 난 SQL 자체에 대한 모델 후였다. 나는 추상화 수준이 매우 낮다는 것을 알고 있지만, 여러 협력자가 빌드 - 단계의 끝에 "렌더링"할 수있는 SQL 문 (다중 조인, 다중 wheres)에서 작업 할 수있는 상황을 허용 할 수 있습니다.

답변

2

SQLAlchemy의이 ORM 층을 가지고 파이썬 패키지하지만, SQL 생성 계층도 있습니다.당신을 일반적으로

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. 

:

는 [난 당신이 게시물 C# 및 .NET 태그 실현,하지만 난 당신이 거기 밖으로 그 밖의 무엇을보고 싶어 줄 알았는데 여기

몇 가지 예제 코드입니다 SQLAlchemy를 사용하여 데이터베이스에 연결하여 문을 실행합니다. 그럼 당신은 할 수 :

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

희망이 도움이됩니다.

5

Hibernate는 SQL과 같은 구조를 객체로 나타내는 자체 Hibernate Query Language (HQL)을 가지고있다.

+0

이 작업을하려면 DB와 객체 사이의 매핑이 필요합니다. – flq

+0

그래도 여전히 SQL을 생성 할 것입니다. – Egwor

+0

Hibernate는 객체 - 관계형 매핑 도구입니다. 맞습니다. – duffymo

0

.Net에서 Linq은 여러분이 말하는 것을 말합니다.

+0

Linq! = Linq to Sql – BFree

0

여전히 .NET 2.0을 사용 중이며 LINQ로 이동하지 않은 경우 기본 구문 클래스를 만든 다음 데코레이터 패턴을 허용하는 클래스를 만듭니다.

그런 식으로 기본 문장에 필요한 것을 계속 추가 할 수 있습니다.

2

는 OR-매퍼 마이크로 소프트의 LINQ

다음

몇 가지 예로서, : 당신이 시작하는

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; 

일부 링크 :

2

위 내용을 보면 한 명 이상의 프로그래머가이 길을 걷는 것을 보았습니다. (그리고 한 명 이상의 프로그래머에게 필자가 한 명 이상의 프로그래머를 보았다고 말했지만, 보통 얼마나 잘 작동하는지 독자적으로 알아 낸다.)

내가보기에 어려운 점은, 추상화의 방식을 많이 제공하지 않으면 서 상당한 복잡성을 추가하고 있습니다. 당신은 어쨌든 당신이 끝내고있는 SQL이 무엇인지 알 필요가 있습니다.

(적어도 패턴이 직접 절을 지정하고 당신의 그림에로 대표된다. 물론 그 이상으로 추상적으로 ORMs을 정도.)

+0

나는 당신과 함께 ... 당신은 SQL에 대한 좋은 생각이 필요하다. 이 질문에서는 추상화가 아니라 오히려 다중 공동 작업자가 SQL을 생성하기 전에 (SQL) 개체 모델을 수정하는 기능을 제공합니다 ... – flq