Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana saya bisa memeriksa pernyataan SQL (Saya) untuk kebenaran sintaksis?

Setelah mencari alat CLI untuk sintaks linting di Mysql untuk digunakan di Jenkins dan tidak menemukan apa pun dengan cepat (pertanyaan Stackoverflow ini adalah salah satu hasil pertama - LOL) saya menemukan solusi berikut (OS:Linux, tetapi harus layak dengan Windows juga):

Sesuatu seperti berikut:

lint_result=`mysql mysql_test -B -f -e 'select asdf s where x;' 2>&1`; if [ `echo $lint_result | sed -r "s/ERROR ([0-9]*).*/\1/g"` -eq 1064 ]; then echo -e "Syntax error:\n${lint_result}"; fi
Syntax error:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'where x' at line 1

(Untuk memeriksa file sql Anda dapat menggunakan "

Jika sintaks kueri tidak dapat diuraikan oleh mysql, ia mengklaim:ERROR 1064 (42000) pada baris 1:Anda memiliki kesalahan dalam sintaks SQL Anda; periksa manual yang sesuai dengan versi server MySQL Anda untuk sintaks yang tepat untuk digunakan di dekat '' di baris 1

Hanya jika sintaksnya benar, ia mencoba mengeksekusi kueri dan menyadari bahwa tabel tidak ada tetapi ini tidak menarik lagi:

ERROR 1146 (42S02) at line 1: Table 'mysql_test.s' doesn't exist

Oleh karena itu Kesalahan 1064 adalah sintaks yang tidak valid. Anda hanya perlu membuat database pengujian kosong karena jika tidak, hanya kesalahan dengan bagian FROM yang salah yang akan muncul (di sini misalnya database diperlukan untuk mendapatkan hasil pemeriksaan sintaks yang valid:'select asdf from s where x and if;).

Sejauh yang saya uji berfungsi dengan baik (Versi Mysql 5.5).

Berikut versi lengkap skrip bash:

#!/bin/bash

source_dir=${1};
database="mysql_test";
mysql_args="-h127.0.0.1";

mysql $mysql_args -B -e "DROP DATABASE IF EXISTS $database; CREATE DATABASE $database;";
for file in `find $source_dir -name "*.sql"`; do
    lint_result=`mysql $mysql_args $database -f -b < $file 2>&1`;
    if [ "`echo $lint_result | sed -r \"s/ERROR ([0-9]*).*/\1/g\"`" = "1064" ]; then
        echo -e "Syntax error in file ${file}:\n${lint_result}" && exit 1;
    fi;
done


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Bergabung dengan tabel di beberapa server

  2. Mysql menampilkan baris sebagai kolom

  3. Sisipkan massal atau perbarui dengan Hibernate?

  4. Apa cara untuk memindahkan data yang lebih lama dari hari 'Y' ke tabel arsip/riwayat di MySQL?

  5. mencatat verbositas mysql 5.7