Parser เป็นโปรแกรมที่เข้าใจไวยากรณ์ของลำดับคำ/ประโยค และสร้างการแสดงโครงสร้างวากยสัมพันธ์ มีการใช้งานในหลายพื้นที่ เช่น ภาษาโปรแกรม, การประมวลผลภาษาธรรมชาติ, SQL และอื่นๆ เพื่อสาธิตการใช้งาน Parser เราจะอ้างอิงโอเพ่นซอร์ส JSqlParser ในบทช่วยสอนนี้
JSqlParser
JSqlParser เป็นตัวแยกวิเคราะห์คำสั่ง SQL ซึ่งพร้อมใช้งานเป็นโอเพ่นซอร์สใน Github แยกวิเคราะห์คำสั่ง SQL และแปลเป็นลำดับชั้นของคลาส Java ในตัวอย่างต่อไปนี้ เราจะแยกวิเคราะห์คำสั่ง CREATE TABLE โดยใช้ JSqlParser มาเขียนโปรแกรม Java เพื่อแยกวิเคราะห์คำสั่ง CREATE TABLE และเพิ่มคีย์หลักลงไป
คำสั่งสร้างตาราง
CREATE TABLE College_db.Students (
Student_id int,
Name varchar(255),
Course varchar(255),
Join_date DATE
); ในคำสั่ง CREATE TABLE ข้างต้น เราต้องการเพิ่มคอลัมน์ Student_id เป็นคีย์หลัก
โปรแกรม Java เพื่อแยกวิเคราะห์ CREATE TABLE SQL โดยใช้ JSqlParser
ขั้นตอนที่ 1:การเพิ่ม JSqlParser เป็นการพึ่งพา
เรากำลังสร้างโปรเจ็กต์ Maven เพื่อเพิ่ม JSqlParser เป็นการพึ่งพา มาเพิ่มการพึ่งพาด้านล่างในไฟล์ pom.xml
<dependency>
<groupId>com.github.jsqlparser</groupId>
<artifactId>jsqlparser</artifactId>
<version>4.2</version>
</dependency> ขั้นตอนที่ 2:กำหนดคำสั่งอินพุต CREATE TABLE ให้กับตัวแปร
นี่คือคำสั่งอินพุต CREATE TABLE ของเราซึ่งไม่มีคีย์หลัก อักขระขึ้นบรรทัดใหม่ \n เป็นทางเลือก เราสามารถให้ 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" +
");"; ขั้นตอนที่ 3 :แยกวิเคราะห์ SQL โดยใช้ JSqlParser
การใช้คลาส Parser util CCJSqlParserUtil เรากำลังเรียกวิธีแยกวิเคราะห์ด้วยอาร์กิวเมนต์ของ CREATE TABLE sql
Statement createTable = CCJSqlParserUtil.parse(createTableSql); หลังจากดำเนินการเมธอดแยกวิเคราะห์แล้ว ออบเจ็กต์คำสั่ง createTable จะมีลำดับชั้นของคลาส Java ดังต่อไปนี้
เอาต์พุต JSqlParser เป็นลำดับชั้นของคลาส Java ขั้นตอนที่ 4 :สำรวจเอาต์พุต parser
หากดำเนินการวิธีแยกวิเคราะห์สำเร็จ เราจะสามารถรับข้อมูลทั้งหมดเกี่ยวกับคำสั่ง 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"); ขั้นตอนที่ 5 :สร้างข้อจำกัดคีย์หลักเป็นดัชนี
เราสามารถตั้งค่าดัชนีต่างๆ ให้กับ Sql ได้ เช่น Check constraint, Exclude constraint, Foreign key และ Named constraint สำหรับคีย์หลัก เราจำเป็นต้องสร้างข้อจำกัดที่มีชื่อตามด้านล่างนี้ ป>
//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); มาตั้งค่าคีย์หลักของ Student_id เป็นข้อจำกัดที่มีชื่อในดัชนี
//Setting the Primary Key constraint in Index list
List<Index> indexList = new ArrayList<>();
indexList.add(namedConstraint); ขั้นตอนที่ 6:ตั้งค่าดัชนีในคำสั่ง CREATE TABLE
เราจำเป็นต้องตั้งค่ารายการดัชนีในตารางสร้างดังต่อไปนี้เพื่อให้คำสั่งตาราง CREATE ถูกสร้างขึ้นด้วยคีย์หลัก ป>
((CreateTable) createTable).setIndexes(indexList); ทำให้โปรแกรม Java สมบูรณ์เพื่อเพิ่มคีย์หลักใน CREATE TABLE SQL
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);
}
}
} เอาต์พุต ป>
ดังที่เราแสดงด้านล่าง CREATE TABLE ใหม่จะถูกสร้างขึ้นด้วยคีย์หลักของ Student_id นอกจากนี้ชื่อฐานข้อมูลและตารางยังเปลี่ยนเป็น 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)); บทความแนะนำ ป>
- ตัวอย่างตัวแยกวิเคราะห์ Apache Hive