我一直在想,是否有任何代码能够以某种对象树的形式表示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这只是一个例子,外面的事情可能会完全不同,但是的,我很乐意听到在这方面有什么特别之处。
更新:
我知道使用ORM技术从DB获取结果的可能性很多,但我想要的是SQL本身的模型。我知道抽象级别非常低,但它可能会允许多个协作者处理一条SQL语句(多个连接,多个位置),然后可以在构建阶段的末尾“呈现”该语句。
发布于 2009-02-02 22:25:15
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希望这能有所帮助。
发布于 2009-02-02 20:16:46
Hibernate有自己的Hibernate查询语言(HQL),可以将类似SQL的结构表示为对象。
发布于 2009-02-02 20:21:13
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;以下是一些帮助您入门的链接:
https://stackoverflow.com/questions/504692
复制相似问题