سؤال

لقد كنت أتساءل عما إذا كان هناك أي كود يمكّن من تمثيل 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 (صلات متعددة، أماكن متعددة) والتي يمكن بعد ذلك "عرضها" في نهاية مرحلة البناء.

هل كانت مفيدة؟

المحلول

وحزمة الثعبان SQLAlchemy لديها طبقة ORM، ولكن كما أن لديها طبقة الجيل SQL.

[I تدرك أنك الموسومة هذا المنصب ج # وصافي، ولكن أعتقد أنك قد ترغب في معرفة ماذا هو هناك]

وهنا بعض رمز المثال:

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

وآمل أن يساعد هذا.

نصائح أخرى

والسبات لديها قناعاتها السبات لغة الاستعلام (HQL) الذي يمثل يبني-SQL مثل ككائنات.

مخطط OR، مثل Microsoft لينك

وهنا بعض الأمثلة:

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 مجردة إلى ما وراء ذلك.)

ويمكنك محاولة MetaDb . هناك بعض العمل المنجز. http://i3.codeplex.com/Project/ تنزيل / FileDownload.aspx؟ اسم_المشروع = metadb وDownloadId = 11482

ولكن إذا كان يمكنك استخدام الصافي 3.5، يمكنك استخدام LINQ.

في صافي، ينق لا حد كبير ما نتحدث عنه.

إذا كنت لا تزال تستخدم .NET Framework 2.0 و لم تتحرك فصاعدا إلى LINQ، ثم أود أن إنشاء فئة بيان القاعدة، ثم خلق الطبقات التي تسمح لنمط الديكور.

وبهذه الطريقة يمكنك أن تبقي مجرد اضافة ما تحتاج إلى بيان قاعدة الخاص بك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top