• Stars
    star
    661
  • Rank 67,756 (Top 2 %)
  • Language
    TypeScript
  • License
    MIT License
  • Created over 6 years ago
  • Updated 3 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

SQL Language Server

SQL Language Server

build-and-test

The SQL Language Server offers autocompletion, error/warning notifications, and other editor support. It includes a linting feature, an SQL parser, and a Visual Studio Code extension. It supports MySQL, PostgreSQL, and SQLite3 databases.

completion

Packages

Supported DB

  • MySQL
  • PostgreSQL
  • SQLite3

Installation & How to setup

Visual Studio Code

Install the VSC extension.

Other Editors

npm i -g sql-language-server

Neovim

LanguageClient-neovim

Add the following to the init.vim file (.vimrc):

let g:LanguageClient_serverCommands = {
    \ 'sql': ['sql-language-server', 'up', '--method', 'stdio'],
    \ }
nvim-lsp

Run the following command and reference the nvim-lsp documentation for more information.

:LspInstall sqlls

Monaco Editor (monaco-languageclient)

See the example to use the Monaco Editor to develop sql-language-server.

Follow the development section section to check Mocaco Editor working.

Usage

CLI

$ sql-language-server up [options]        run sql-language-server

Options

  --version      Show version number                                   [boolean]
  --help         Show help                                             [boolean]
  --method, -m  What use to communicate with sql language server
                   [string] [choices: "stdio", "node-ipc"] [default: "node-ipc"]
  --debug, -d    Enable debug logging                 [boolean] [default: false]
  • Example
$ sql-language-server up --method stdio

Configuration

There are two ways to use configuration files.

  • Set personal configuration file (~/.config/sql-language-server/.sqllsrc.json)
  • Set project configuration file on your project root (${YOUR_PROJECT}/.sqllsrc.json)
  • Use workspace/configuration according to LSP specification

Example for personal configuration file

  • Examples
{
  "connections": [
    {
      "name": "sql-language-server",
      "adapter": "mysql",
      "host": "localhost",
      "port": 3307,
      "user": "username",
      "password": "password",
      "database": "mysql-development",
      "projectPaths": ["/Users/joe-re/src/sql-language-server"],
      "ssh": {
        "user": "ubuntu",
        "remoteHost": "ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
        "dbHost": "127.0.0.1",
        "port": 3306,
        "identityFile": "~/.ssh/id_rsa",
        "passphrase": "123456"
      }
    },
    {
      "name": "postgres-project",
      "adapter": "postgres",
      "host": "localhost",
      "port": 5432,
      "user": "postgres",
      "password": "pg_pass",
      "database": "pg_test",
      "projectPaths": ["/Users/joe-re/src/postgres_project"]
    },
    {
      "name": "sqlite3-project",
      "adapter": "sqlite3",
      "filename": "/Users/joe-re/src/sql-language-server/packages/server/test.sqlite3",
      "projectPaths": ["/Users/joe-re/src/sqlite2_project"]
    }
  ]
}

Please restart sql-language-server process after creating .sqllsrc.json.

Connection parameters

Key Description value required default
name Connection name(free-form text) true
adapter Database type "mysql" or "postgres" or "sqlite3" or "bigquery" true
host Database host string false
port Database port string false mysql:3306, postgres:5432
user Database user string false mysql:"root", postgres:"postgres"
password Database password string false
database Database name string false
filename Database filename(only for sqlite3) string false
projectPaths Project path that you want to apply(if you don't set it configuration will not apply automatically when lsp's started up) string[] false []
ssh Settings for port fowarding *see below SSH section false
SSH
Key Description value required default
remoteHost The host address you want to connect to string true
remotePort Port number of the server for ssh number false 22
user User name on the server string false
dbHost Database host on the server string false 127.0.0.1
dbPort Database port on the server number false mysql:3306, postgres:5432
identityFile Identity file for ssh string false ~/.ssh/config/id_rsa
passphrase Passphrase to allow to use identity file string false

Personal configuration file

The personal configuration file is located at ~/.config/sql-language-server/.sqllsrc.json. When the SQL Language Server starts, it will try to read this file.

Project configuration file

The project configuration file is located at ${YOUR_PROJECT_ROOT}/.sqllsrc.json. This file has the same settings as the personal configuration file, with a few exceptions:

  • The connection property is specified directly, rather than as an array.
  • The project path does not need to be set. If it is set, it will be ignored.
  • The project configuration file is merged with the personal configuration file, if it exists.

Here is an example project configuration file for a PostgreSQL database:

{
  "name": "postgres-project",
  "adapter": "postgres",
  "host": "localhost",
  "port": 5432,
  "user": "postgres",
  "database": "pg_test"
}

If you have also set a personal configuration, the project configuration and personal configure will be merged if they have the same name.

Personal configuration example:

{
  "connections": [{
    "name": "postgres-project",
    "password": "password",
    "ssh": {
      "user": "ubuntu",
      "remoteHost": "ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
      "dbHost": "127.0.0.1",
      "port": 5432,
      "identityFile": "~/.ssh/id_rsa",
      "passphrase": "123456"
    }
  }]
}

It will merge them as follows:

{
  "name": "postgres-project",
  "adapter": "postgres",
  "host": "localhost",
  "port": 5432,
  "user": "postgres",
  "database": "pg_test",
  "password": "password",
  "ssh": {
    "user": "ubuntu",
    "remoteHost": "ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
    "dbHost": "127.0.0.1",
    "port": 5432,
    "identityFile": "~/.ssh/id_rsa",
    "passphrase": "123456"
  }
}

Workspace configuration for sql-language-server

Parameters of workspace configuration
  • connections: This parameter is the same as the connections parameter in the personal configuration file. It allows you to specify the connections for your workspace.
  • lint: This parameter is the same as the configuration of sqlint. It allows you to configure the linting rules for your workspace.
Example of workspace configuration

~/.config/nvim/coc-settings.json

{
  "languageserver": {
    "sql": {
      "command": "sql-language-server",
      "args": ["up", "--method", "stdio"],
      "filetypes": ["sql"],
      "settings": {
        "sqlLanguageServer": {
          "connections": [
            {
              "name": "mysql_project",
              "adapter": "mysql",
              "host": "127.0.0.1",
              "port": 3306,
              "user": "sqlls",
              "password": "sqlls",
              "database": "mysql_db",
              "projectPaths": ["/Users/joe_re/src/MysqlProject"],
              "ssh": {
                "user": "ubuntu",
                "remoteHost": "xxx-xx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
                "dbHost": "127.0.0.1",
                "port": 3306
              }
            }
          ],
          "lint": {
            "rules": {
              "align-column-to-the-first": "error",
              "column-new-line": "error",
              "linebreak-after-clause-keyword": "off",
              "reserved-word-case": ["error", "upper"],
              "space-surrounding-operators": "error",
              "where-clause-new-line": "error",
              "align-where-clause-to-the-first": "error"
            }
          }
        }
      }
    }
  }
}
  • VS Code workspace setting
"settings": {
  "sqlLanguageServer.connections": [
    {
      "name": "mysql_project",
      "adapter": "mysql",
      "host": "127.0.0.1",
      "port": 3306,
      "user": "sqlls",
      "password": "sqlls",
      "database": "mysql_db",
      "projectPaths": ["/Users/joe_re/src/MysqlProject"],
      "ssh": {
        "user": "ubuntu",
        "remoteHost": "xxx-xx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
        "dbHost": "127.0.0.1",
        "port": 3306
      }
    }
  ],
  "sqlLanguageServer.lint": {
    "rules": {
      "align-column-to-the-first": "off",
      "column-new-line": "error",
      "linebreak-after-clause-keyword": "error",
      "reserved-word-case": ["error", "upper"],
      "space-surrounding-operators": "error",
      "where-clause-new-line": "error",
      "align-where-clause-to-the-first": "error",
    }
  }
}

Inject environment variables

${env:VARIABLE_NAME} syntax allows you to replace configuration value with an environment variable. This is useful if you don't want to store the value in the configuration file.

Example
{
  "adapter": "mysql",
  "host": "localhost",
  "port": 3307,
  "user": "username",
  "password": "${env:DB_PASSWORD}",
  "database": "mysql-development",
  "ssh": {
    "user": "ubuntu",
    "remoteHost": "ec2-xxx-xxx-xxx-xxx.ap-southeast-1.compute.amazonaws.com",
    "dbHost": "127.0.0.1",
    "port": 3306,
    "identityFile": "~/.ssh/id_rsa",
    "passphrase": "${env:SSH_PASSPHRASE}"
  }
}

Switch database connection

If you have multiple connection entries in your personal config file, you can switch the database connection.

2020-05-25_15-23-01

VSC extension provides Switch database connection command.

Raw RPC param:

method: workspace/executeCommand
command: switchDataBaseConnection
arguments: string(project name)

SQLite3 Notes

If you get error when you use sqlite3 connection, you may need to rebuild sqlite3 to your environment.

VSC extension provides the command to rebuild it.(Name: Rebuild SQLite3 Client) image

If you're using sql-language-server directly, go to the install directory and run npm rebuild sqlite to rebuild it.

Linting

You can use lint rules provided by sqlint to ensure your SQL code follows best practices and avoid potential errors. Refer to the sqlint configuraton documentation to learn how to use and configure the linter to match your use case.

sqlint-on-editor

You can also use sqlint to automatically fix any problems it can identify in your code.

2020-06-18_08-24-03

Raw RPC param:

method: workspace/executeCommand
command: fixAllFixableProblems
arguments: string(document uri)

Contributing to sql-language-server

Bug Reports and Feature Requests

If you have any questions, problems or suggestions for improvements, feel free to create a new issue on GitHub Issues. You can also start a discussion there about new rules for SQLint.

Development

Code contributions are always appreciated, so feel free to fork the repo and submit pull requests.

Development environment

You can start developing sql-language-server using Docker Compose. To begin the development process in your Docker container, run the following command:

$ docker compose up

Open http://localhost:3000 on your browser.

Migrating the Database

To migrate the database, follow these steps:

  1. Login into development Docker container
$ docker compose exec assets bash
  1. Migrate the database
$ cd example/monaco_editor
$ yarn migrate:postgres # postgres
$ yarn migrate:mysql    # mysql
$ yarn migrate:sqlite   # sqlite3

More Repositories

1

cafe-pitch

Markdown-driven presentation tool built on Electron.
TypeScript
55
star
2

async-storage-repl

AsyncStorageRepl provides you to access remote ReactNative application's AsyncStorage from your node REPL.
JavaScript
36
star
3

vuex-socketio-plugin

Vuex plugin to integrate socket.io client
TypeScript
34
star
4

tubutler

Simple and useful YouTube Player for Desktop
TypeScript
28
star
5

object-dig

This allow you to use method like Ruby's hash#dig in JavaScript.
JavaScript
22
star
6

battle-ax

vuex wrapper for type-safe
TypeScript
13
star
7

automock

Generate WebAPI mocking response data from your rails application's request-spec. And run proxy server for mocking response.
Ruby
10
star
8

graphql-cost-calculator

cost calculator for GraphQL query
TypeScript
9
star
9

eslint-vue-typescript-sample

Vue
7
star
10

react-rails-tutorial

Ruby
7
star
11

spectron-fake-menu

Provide manipulation of menus in your spectron's specs.
JavaScript
5
star
12

typesafe-flux-sample

JavaScript
5
star
13

spectron-fake-dialog

Mock dialog module in your spectron's specs.
JavaScript
5
star
14

pomodo-desuka

JavaScript
4
star
15

pivotal-release-board

Display your PivotalTracker's release list beautifully.
JavaScript
4
star
16

backlog-api-client

This is a simple and easy-to-use Backlog Restful(V2) Api client for Ruby.
Ruby
3
star
17

flowtype-react-sample

JavaScript
3
star
18

dash-button-tweet

JavaScript
2
star
19

sass-class-prefix

Parse sass file and add any prefix to scss(sass)'s class selector.
JavaScript
2
star
20

sorcery_sample_with_rails5_api

Ruby
2
star
21

react-apollo-hands-on

JavaScript
2
star
22

segmentation-person-media

Person segmentation from a media element and manipulate background in the browser
TypeScript
2
star
23

swagger-rack-validation

(WIP)API validation based swagger for Rack Applications
Ruby
1
star
24

sample-graphql-on-ruby

Ruby
1
star
25

OCR-Screen

This is a chrome extension to allow you to do OCR that you open page of browser.
JavaScript
1
star
26

k-db-scraper

ๆ ชไพกใƒ‡ใƒผใ‚ฟใƒ€ใ‚ฆใƒณใƒญใƒผใƒ‰ใ‚ตใ‚คใƒˆใฎๆไพ›ใ—ใฆใ„ใ‚‹ใƒ‡ใƒผใ‚ฟใ‚’ๅ€‹ไบบ็š„ใซไฝฟใ„ใ‚„ใ™ใ„ใ‚ˆใ†ใซใ™ใ‚‹
Ruby
1
star
27

hia

Easy and customizable generator system for creating template.
JavaScript
1
star