2008-11-23 9 views

Odpowiedz

39

UPDATE 2: org.hibernate.jdbc.util.BasicFormatterImpl został przeniesiony w wydaniu 4.0. Znajduje się teraz pod adresem: org.hibernate.engine.jdbc.internal.BasicFormatterImpl.

AKTUALIZACJA: Marsze technologiczne na. Jak zauważył Alex, org.hibernate.pretty.Formatter już nie istnieje od wersji 3.3.2.GA. Wymiana jest org.hibernate.jdbc.util.BasicFormatterImpl:

String formattedSQL = new BasicFormatterImpl().format(sql); 

W tym piśmie, odpowiedź ta ma najwięcej upvotes, a powinien mieć aktualny poprawną odpowiedź w nim, więc zaktualizowaliśmy go odpowiednio. Rekwizyty dla Alexa za to.

...

ORIGINAL ODPOWIEDŹ: Jeśli używasz hibernacji, że mają jeden wbudowany: org.hibernate.pretty.Formatter

String formattedSQL = new Formatter(sql).format(); 
+1

lub DDLFormatter, który będzie a) Wstawić znak nowej linii po każdym przecinku; b) Wciśnij trzy spacje po każdym wstawionym znaku nowej linii; –

+0

Wygląda na to, że dokładnie to, czego szukam. Hibernate jest już podstawowym komponentem mojego rozwiązania, więc nie wprowadza nowej zależności. –

+0

FYI, BasicFormatterImpl nie obsługuje komentarzy "-", a DDLFormatter jest jeszcze bardziej prymitywny, patrz http://www.dil.univ-mrs.fr/~massat/docs/hibernate-3.1/api/org/hibernate/pretty/ DDLFormatter.html # format() – Karl

1

Można po prostu użyć SQL grammar i zbudować AST z antlr. Następnie możesz wypisać drzewo w dowolnym formacie.

+0

Dzięki. To będzie mój plan ostateczności. Na szczęście jestem zbyt zajęty nową pracą, żeby na to teraz spojrzeć i mam nadzieję, że dostanę odpowiedź, zanim będę musiał zakasać rękawy. –

5

Częścią zaćmienia Data Tools Platform jest SQL Development Tools Project.

The stronę opisującą sposób użycia SQL Query Parser ma niezwykle krótki wykorzystanie SQLQuerySourceFormat która udostępnia następujące opcje:

  • preserveSourceFormat = opcji zachowania formatowania sygnału wejściowego, gdy tekst źródłowy SQL jest generowany
  • statementTerminator = znak oddzielający wiele instrukcji SQL
  • hostVariablePrefix = znak, który poprzedza zmienną języka języka obcego o parametrze parametrMarker = znak w identyfikuje parametr języka gospodarza
  • delimitedIdentifierQuote * = postać, która otacza rozdzielonych identyfikatory, których pisanie w przypadku zostaną zachowane
  • omitSchema = aktualny schemat (pominięty w źródle SQL, niejawny do niewykwalifikowanych odniesień stołowych)
  • qualifyIdentifiers = Flaga opisując jak identyfikatory w kodzie SQL zostaną zakwalifikowane
  • preserveComments = opcja zachowania komentarze w analizowanej źródła SQL lub/i wygenerowany SQL źródłowego
  • generateCommentsForStatementOnly = opcja generowania komentarzy dla źródła SQL tylko w kontekst kompletnego s tatement, lub jeśli jest ustawiona na false, dla pojedynczego zapytania SQL obiektów poza kontekstem oświadczeniu, jak również
+0

To rozwiązanie zdecydowanie by mi pasowało, ale wolę prostotę rozwiązania Hibernate. Szkoda, że ​​mogłem dać ci tylko +1 –

1

Może jsqlparser zadziała dla Ciebie.

Nie tak łatwo znaleźć, jak mogłoby się wydawać, ponieważ jest tam kilka nieistniejących projektów. W rzeczywistości nie udało mi się go znaleźć, więc skończyłem robiąc własne rzeczy (na podstawie parsera h2 - możesz się ze mną skontaktować, jeśli wszystko inne zawiedzie). W konsekwencji nie wiem, czy ma upiększacz, ale pisanie jednego na wierzchu powinno być wystarczająco proste.

Jest oparty na gramatyce i JavaCC, więc prawdopodobnie jest lepszym rozwiązaniem niż wymyślanie tego koła z antlr w każdym przypadku. Może się okazać, że potrzebujesz obsługi różnych dialektów sql w złożonych instrukcjach, że jakiekolwiek podejście oparte na gramatyce zawodzi.

2

Czy za:

http://www.sqlinform.com

Zapewniają one zarówno wersji API i wersja wiersza poleceń (jak również w wersji online).

Brak wiedzy o kosztach.

1

Czy ta praca - SQL Formatter.

+0

Muszę być w stanie to zrobić off-line jak po kroku generowania kodu w moim procesie kompilacji. Więc SQL Formatter nie jest dla mnie opcją. –

4

Z hibernacji v3.3.2.GA, org.hibernate.pretty.Formatter już nie istnieje. Można używać jej Zamiennik: org.hibernate.jdbc.util.BasicFormatterImpl

Formatter f = new BasicFormatterImpl(); 
String formatted_sql_code = f.format(ugly_sql_code); 
0

Tak to jest na pewno to, czego szukasz: A SQL formatter library że wsparcie Oracle, SQL Server, DB2, MySQL i PostgreSQL, Teradata .