PowerShell + SQL Server + LINQ + ILGenerator = PowerQuery

C'è poco da fare, la Powershell ti vizia. Una volta che ti abitui a lavorare nella shell manipolando oggetti via pipe, tutto il resto, da cmd a bash sembra preistorico.

Una feature che però mi è sempre mancata nella shell, è la possibilità di interagire con le basi dati con altrettanta semplicità. Strumenti prettamente amministrativi tipo SQL Server PowerShell Provider ed SMO non fanno al caso nostro. 

Il risultato si chiama PowerQuery (si accettano ben volentieri suggerimenti sul nome!!), progettino open source che trovate su CodePlex http://powerquery.codeplex.com/ . Attualmente è disponibile una prima beta release.

Se vi piace fatevi avanti con suggerimenti e collaborazioni 

Venendo all'architettura, da buon drogato di ORM (da tempi non sospetti  ),  bisognava solo rendere dinamica la generazione di un Data Model, evitando l'uso di tool tipo SQLMetal e similari, pur mantenendone le finalità.

La scelta dell'ORM è caduta per il momento su LINQ to SQL, per due ragioni molto semplici (sento già mugugnare):

  1. E' molto snello
  2. Le note limitazioni che possono affliggere un'applicazione non creano problemi ell'ambito dello scripting, anzi.

Un prossimo passo sarà il supporto per l'Entity Framework o più probabilmente NHibernate, principalmente per il supporto di RDBMS diversi da SQL Server.

Venendo alla generazione dinamica, l'occasione è stata ghiotta per cazzeggiare con ILGenerator, col compito di generare al volo il Data Model + DataContext. A parte qualche madonnina lanciata nel far quadrare generics e tipi incompleti, il resto è filato liscio. I tempi di generazione e caricamento dell'assembly per un database di media complessità sono stupefacenti ( < 1s su un notebook decentemente carrozzato)!   

Il progetto include inoltre Dynamic LINQ (si veda il post di Scott Gu a riguardo) e alcune brillanti intuizioni di Bart de Smet. L'sipirazione per il progetto viene dal mitico LINQPad.

Spero possa esservi utile! Fatemi sapere!

Ecco un veloce esempio di utilizzo, il resto lo trovate su CodePlex:

add-pssnapin AlexPilotti.PowerQuery

# Set your connection string and target path (your temp folder in this sample)
$connStr = "Data Source=.\SQLEXPRESS;Integrated Security=SSPI;Initial Catalog=Northwind"
$assemblyParentPath = $Env:Temp

# Generate the assembly
New-DataModelAssembly $connStr "MyNorthwindModel" $assemblyParentPath "Northwind"

# Load your LINQ to SQL DataContext
$ctx = New-Object "Northwind.MainDataContext" $connStr

# Show the content of the Products table using the generated data model: 
$ctx.Products

# Close the database connection and free al related resources
$ctx.Dispose()

posted @ giovedì 19 marzo 2009 04:16

Print

Comments on this entry:

# re: PowerShell + SQL Server + LINQ + ILGenerator = PowerQuery

Left by Alessandro Pilotti at 19/03/2009 14:13
Gravatar
Il contesto di questo progetto prevede principalmente la possibilità di manipolare velocemente database objects via shell, da cui la vicinanza al modello fisico. L'"anemia" del modello è quindi una condizione necessaria.

Esigenze come associazioni n:m o di ereditarietà esulano dagli obiettivi primari (da cui tra le altre la scelta di L2SQL al posto di NHibernate o EF).

Se però troviamo soluzioni semplici per integrarle, adatte al contesto e senza reinventare strumenti esistenti, ben venga!

Ad es. un problemino che richiede una soluzione, è il naming delle associazioni. Attualmente prendono il nome delle entità target, il che è potenzialmente di difficile interpretazione in modelli non banali.

Se l'utente ha necessità di un data model "serio", la scelta cade su altri strumenti (VS08, CodeSmith, SQLMetal fino all'editing diretto degli HBM, DBML, EDMX, etc). Una volta generato il data model all'interno di un assembly DLL, può essere usato nella PowerShell al pari di quanto generato da New-DataModelAssembly.





Comments have been closed on this topic.