문제

나는 조립, 수정 및 마침내 유효한 SQL로 렌더링 할 수있는 일부 객체 트리 형태의 SQL을 표현할 수있는 코드가 있는지 궁금합니다.

내 머리 꼭대기에서 그것은 그런 식으로 보일 수 있습니다 ...

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

이것은 단지 예일 뿐이며 거기에있는 것은 완전히 다를 수 있지만 그렇습니다. 그 점에서 무엇이 나오는지 듣고 싶습니다.

업데이트:

DB에서 결과를 얻기 위해 ORM Technologies를 사용하는 수많은 가능성을 알고 있지만 SQL 자체의 모델을 따랐습니다. 추상화 수준은 상당히 낮다는 것을 알고 있지만, 여러 협력자가 SQL 문 (다중 조인, 다중 wher)에서 작업 할 수있는 상황을 허용 할 수 있으며, 이는 빌드 상 끝에서 "렌더링"할 수 있습니다.

도움이 되었습니까?

해결책

Python 패키지 SQLALCHEMY에는 ORM 층이 있지만 SQL 생성층도 있습니다.

이 게시물 C# 및 .NET에 태그를 지정 한 것을 알고 있지만 다른 것이 무엇인지보고 싶을 것이라고 생각했습니다.

다음은 몇 가지 예제 코드입니다.

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.

일반적으로 sqlalchemy를 사용하여 데이터베이스에 연결하여 문을 실행합니다. 그런 다음 할 수 있습니다 :

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

도움이 되었기를 바랍니다.

다른 팁

Hibernate에는 자체 최대 절전 모드 쿼리 언어 (HQL)가있어 SQL 유사 구성을 객체로 나타냅니다.

Microsoft 's와 같은 오르기 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;

시작하기위한 일부 링크 :

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

내가 보는 어려움은 당신이 추상화 방식을 많이 제공하지 않고 상당한 복잡성을 추가하고 있다는 것입니다. 당신은 어쨌든 어떤 SQL을 끝낼지 알아야합니다.

(적어도 패턴이 당신의 그림에 표시되는 정도까지, 당신은 조항을 직접 지정하고 있습니다. Orms는 그 이상을 넘어서서 추상적입니다.)

당신은 시도 할 수 있습니다 메타 브. 몇 가지 작업이 완료되었습니다.샘플 쿼리 http://i3.codeplex.com/project/download/filedownload.aspx?projectname=metadb&downloadid=11482

그러나 .NET 3.5를 사용할 수 있다면 LINQ를 사용할 수 있습니다.

.NET에서 LINQ는 당신이 말하는 것을 거의 수행합니다.

여전히 .NET 2.0을 사용하고 있고 LINQ로 앞으로 이동하지 않은 경우 기본 명령문 클래스를 만들고 데코레이터 패턴을 허용하는 클래스를 만듭니다.

그렇게하면 기본 문장에 필요한 것을 계속 추가 할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top