Trình phân tích cú pháp là một chương trình hiểu ngữ pháp của chuỗi từ/câu và tạo ra biểu diễn cây cú pháp. Nó đang được sử dụng trong nhiều lĩnh vực như ngôn ngữ lập trình, xử lý ngôn ngữ tự nhiên, SQL, v.v. Để minh họa cách sử dụng Trình phân tích cú pháp, chúng tôi sẽ đề cập đến JSqlParser mã nguồn mở trong hướng dẫn này.
JSqlParser
JSqlParser là trình phân tích cú pháp câu lệnh SQL có sẵn dưới dạng nguồn mở trong Github. Nó phân tích một câu lệnh SQL và dịch thành một hệ thống phân cấp của các lớp Java. Trong ví dụ sau, chúng ta sẽ phân tích câu lệnh CREATE TABLE bằng cách sử dụng JSqlParser. Hãy viết một chương trình Java để phân tích câu lệnh CREATE TABLE và thêm khóa chính vào đó.
TẠO câu lệnh BẢNG
CREATE TABLE College_db.Students (
Student_id int,
Name varchar(255),
Course varchar(255),
Join_date DATE
); Trong câu lệnh CREATE TABLE ở trên, chúng ta muốn thêm Cột Student_id làm Khóa chính.
Chương trình Java để phân tích cú pháp CREATE TABLE SQL bằng cách sử dụng JSqlParser
Bước 1:Thêm JSqlParser làm phần phụ thuộc
Chúng tôi đang tạo một dự án maven để thêm JSqlParser làm phần phụ thuộc. Hãy thêm phần phụ thuộc bên dưới vào tệp pom.xml.
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.2</version>
</dependency> Bước 2:Gán câu lệnh CREATE TABLE đầu vào cho một biến
Đây là câu lệnh CREATE TABLE đầu vào của chúng tôi không có khóa chính. Ký tự dòng mới \n là tùy chọn. Chúng tôi cũng có thể cung cấp SQL hoàn chỉnh trong một dòng duy nhất. Để dễ đọc, chúng tôi cung cấp thông tin đầu vào ở nhiều dòng.
String createTableSql = "CREATE TABLE College_db.Students (\n" +
" Student_id int,\n" +
" Name varchar(255),\n" +
" Course varchar(255),\n" +
" Join_date DATE\n" +
");"; Bước 3:Phân tích cú pháp SQL bằng JSqlParser
Sử dụng Trình phân tích cú pháp sử dụng lớp CCJSqlParserUtil , chúng ta đang gọi phương thức phân tích cú pháp với đối số là CREATE TABLE sql.
Statement createTable = CCJSqlParserUtil.parse(createTableSql); Sau khi thực thi phương thức phân tích cú pháp, đối tượng Statement createTable có cấu trúc phân cấp của các lớp Java như bên dưới.
JSqlParser đầu ra dưới dạng phân cấp của các lớp Java Bước 4 :Khám phá đầu ra của trình phân tích cú pháp
Nếu phương thức phân tích cú pháp được thực thi thành công, chúng ta có thể nhận được tất cả thông tin về câu lệnh CREATE TABLE. Hãy lấy tên cơ sở dữ liệu/bảng và định nghĩa cột của câu lệnh. Ngoài ra, chúng tôi đang thay đổi cơ sở dữ liệu và tên bảng trong câu lệnh tạo bảng.
System.out.println("Table Name from query: " + ((CreateTable) createTable).getTable().getName());
System.out.println("Database Name from query: " + ((CreateTable) createTable).getTable().getSchemaName());
System.out.println("\nColumns in the given insert query");
System.out.println("---------------------------------\n");
for(ColumnDefinition col: ((CreateTable) createTable).getColumnDefinitions())
{
System.out.println(col.getColumnName() + " - " + col.getColDataType().toString());
}
//Changing the DB and table name
((CreateTable) createTable).getTable().setSchemaName("College_db_bk");
((CreateTable) createTable).getTable().setName("Students_bkup"); Bước 5:Tạo ràng buộc khóa chính làm chỉ mục
Chúng ta có thể đặt chỉ mục khác nhau cho Sql, chẳng hạn như Ràng buộc kiểm tra, Ràng buộc loại trừ, Khóa ngoại và Ràng buộc được đặt tên. Đối với khóa chính, chúng ta cần tạo ràng buộc Named như dưới đây.
//Creating Primary Key constraint
NamedConstraint namedConstraint = new NamedConstraint();
namedConstraint.setType("PRIMARY KEY");
//Adding column names for the Primary Key
List<Index.ColumnParams> columns = new ArrayList<>();
Index.ColumnParams columnParams = new Index.ColumnParams("Student_id");
columns.add(columnParams);
//Setting columns in the Primary Key constraint
namedConstraint.setColumns(columns); Hãy đặt Khóa chính của Sinh viên_id làm Ràng buộc được đặt tên trong chỉ mục.
//Setting the Primary Key constraint in Index list
List<Index> indexList = new ArrayList<>();
indexList.add(namedConstraint); Bước 6:Đặt chỉ mục trong câu lệnh CREATE TABLE
Chúng ta cần thiết lập danh sách chỉ mục trong bảng tạo như bên dưới để câu lệnh bảng CREATE sẽ được tạo bằng Khóa chính.
((CreateTable) createTable).setIndexes(indexList); Hoàn thành chương trình Java để thêm khóa chính vào SQL CREATE TABLE
import net.sf.jsqlparser.JSQLParserException;
import net.sf.jsqlparser.parser.CCJSqlParserUtil;
import net.sf.jsqlparser.statement.Statement;
import net.sf.jsqlparser.statement.create.table.ColumnDefinition;
import net.sf.jsqlparser.statement.create.table.CreateTable;
import net.sf.jsqlparser.statement.create.table.Index;
import net.sf.jsqlparser.statement.create.table.NamedConstraint;
import java.util.ArrayList;
import java.util.List;
public class AddPrimaryKey {
public static void main(String[] args) {
System.out.println("Adding Primary key in the CREATE TABLE statement");
System.out.println("-------------------------------------\n");
//Assign the input CREATE TABLE sql
String createTableSql = "CREATE TABLE College_db.Students (\n" +
" Student_id int,\n" +
" Name varchar(255),\n" +
" Course varchar(255),\n" +
" Join_date DATE\n" +
");";
try {
//Parsing Create table statement using JSqlParser
Statement createTable = CCJSqlParserUtil.parse(createTableSql);
//Getting the table and database name from Create table
System.out.println("Table Name from query: " + ((CreateTable) createTable).getTable().getName());
System.out.println("Database Name from query: " + ((CreateTable) createTable).getTable().getSchemaName());
System.out.println("\nColumns in the given insert query");
System.out.println("---------------------------------\n");
for (ColumnDefinition col : ((CreateTable) createTable).getColumnDefinitions()) {
System.out.println(col.getColumnName() + " - " + col.getColDataType().toString());
}
//Changing the DB and table name
((CreateTable) createTable).getTable().setSchemaName("College_db_bk");
((CreateTable) createTable).getTable().setName("Students_bkup");
//Creating Primary Key constraint
NamedConstraint namedConstraint = new NamedConstraint();
namedConstraint.setType("PRIMARY KEY");
//Adding column names for the Primary Key
List<Index.ColumnParams> columns = new ArrayList<>();
Index.ColumnParams columnParams = new Index.ColumnParams("Student_id");
columns.add(columnParams);
//Setting columns in the Primary Key constraint
namedConstraint.setColumns(columns);
//Setting the Primary Key constraint in Index list
List<Index> indexList = new ArrayList<>();
indexList.add(namedConstraint);
//Setting the indexes in Create table statement
((CreateTable) createTable).setIndexes(indexList);
System.out.println("New CREATE TABLE statement with Primary Key");
System.out.println("---------------------------------");
System.out.println(createTable + ";");
} catch (JSQLParserException e) {
throw new RuntimeException(e);
}
}
} Đầu ra
Như chúng tôi trình bày bên dưới, CREATE TABLE mới được tạo bằng khóa chính là Sinh viên_id. Ngoài ra, tên cơ sở dữ liệu và bảng cũng được đổi thành College_db_bk.Students_bkup.
Adding Primary key in the CREATE TABLE statement
-------------------------------------
Table Name from query: Students
Database Name from query: College_db
Columns in the given insert query
---------------------------------
Student_id - int
Name - varchar (255)
Course - varchar (255)
Join_date - DATE
New CREATE TABLE statement with Primary Key
---------------------------------
CREATE TABLE College_db_bk.Students_bkup (Student_id int,
Name varchar (255),
Course varchar (255),
Join_date DATE,
PRIMARY KEY (Student_id)); Bài viết được đề xuất
- Ví dụ về trình phân tích cú pháp Hive của Apache