首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否存在用于生成SQL的OO模型?

是否存在用于生成SQL的OO模型?
EN

Stack Overflow用户
提问于 2009-02-02 20:15:55
回答 7查看 341关注 0票数 1

我一直在想,是否有任何代码能够以某种对象树的形式表示SQL,这些对象树可以被组装、修改,然后最终呈现为有效的SQL?

在我的脑海中它可能看起来像这样...

代码语言:javascript
复制
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语句(多个连接,多个位置),然后可以在构建阶段的末尾“呈现”该语句。

EN

回答 7

Stack Overflow用户

回答已采纳

发布于 2009-02-02 22:25:15

python包SQLAlchemy有一个ORM层,但它也有一个SQL生成层。

我知道你给这篇文章贴上了c#和.net的标签,但我想你可能想看看外面还有什么

下面是一些示例代码:

代码语言:javascript
复制
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连接到数据库来执行该语句。然后您可以执行以下操作:

代码语言:javascript
复制
for row in stmt.execute():
    print 'Name:', row.c.FirstName, row.c.LastName, 'City:', row.c.City

希望这能有所帮助。

票数 2
EN

Stack Overflow用户

发布于 2009-02-02 20:16:46

Hibernate有自己的Hibernate查询语言(HQL),可以将类似SQL的结构表示为对象。

票数 5
EN

Stack Overflow用户

发布于 2009-02-02 20:21:13

OR映射器,如微软的LINQ

下面是一些示例:

代码语言:javascript
复制
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;

以下是一些帮助您入门的链接:

  • http://www.hookedonlinq.com/LINQtoSQL5MinuteOverview.ashx
  • http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx
  • http://msdn.microsoft.com/en-us/library/bb386976.aspx
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/504692

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档