【问题标题】:Are there OO models to generate SQL?是否有 OO 模型来生成 SQL?
【发布时间】:2010-10-05 00:25:37
【问题描述】:

我一直想知道是否有任何代码能够以某种对象树的形式表示 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 技术从数据库中获取结果的多种可能性,但我追求的是 SQL 本身的模型。我知道抽象级别非常低,但它可能允许多个协作者可以处理 SQL 语句(多个连接,多个 where),然后可以在构建阶段结束时“渲染”。

【问题讨论】:

    标签: c# .net sql semantics


    【解决方案1】:

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

    【讨论】:

    • 我想你需要数据库和对象之间的映射才能工作?
    • 它仍然会生成 sql
    • 是的,没错,Hibernate 是一个对象-关系映射工具。
    • C# - 应该查看标签。对不起。也许 NHibernate 适合您,但听起来 LINQ 会更合适。
    【解决方案2】:

    在 .Net 中,Linq 的功能与您所说的差不多。

    【讨论】:

      【解决方案3】:

      如果您仍在使用 .NET 2.0 并且尚未继续使用 LINQ,那么我将创建一个基本语句类,然后创建允许使用装饰器模式的类。

      这样您就可以继续在基本语句中添加您需要的内容。

      【讨论】:

        【解决方案4】:

        你可以试试MetaDb。有一些工作完成。 Sample query http://i3.codeplex.com/Project/Download/FileDownload.aspx?ProjectName=metadb&DownloadId=11482

        但如果您可以使用 .NET 3.5,则可以使用 LINQ。

        【讨论】:

          【解决方案5】:

          一个 OR-Mapper,例如微软的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;
          

          一些帮助您入门的链接:

          【讨论】:

            【解决方案6】:

            见上文,我见过不止一个程序员走上这条路。 (而且我告诉不止一位程序员,我见过不止一位程序员......但通常他们最终会自己发现它的工作原理。)

            我看到的困难在于,您在没有提供太多抽象方式的情况下增加了相当大的复杂性。您几乎需要知道最终会使用什么 SQL。

            (至少在您的插图中所表示的模式的程度上,您直接指定子句。ORM 的抽象远不止于此。)

            【讨论】:

            • 我同意你的意见......你需要对 SQL 有一个很好的了解。在这个问题中,我不是在抽象之后,而是在最终生成 SQL 之前让多个协作者修改(SQL)对象模型的能力......
            【解决方案7】:

            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
            

            希望这会有所帮助。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2011-11-11
              • 1970-01-01
              • 2021-10-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2010-11-13
              • 2022-10-25
              相关资源
              最近更新 更多