# 
        Connect to MariaDB from a Next.js App
    
        # 
        Prequisites
    
- A running Next.js app
 - A running MariaDB (or MySQL) instance with user access configured
 
        # 
        Install Dependencies
    
This solution uses the knex and mysql2 packages. Install them as
dependencies.
npm install knex mysql2
        # 
        Set Environment Variables
    
Set the following environment variables in whichever way makes sense for your
situation. If you are connecting to a development database server from a
development machine, you may create a file called .env.local in the root
directory of your app.
DB_HOST= 127.0.0.1
DB_PORT= 3306
DB_DATABASE= [database name]
DB_USER= [database user name]
DB_PASSWORD= [database user password]
You may need to change the host or the port depending on your setup.
        # 
        Create a Database Connection File
    
Create a new file called lib/db.ts.
import knex from "knex";
export const db = knex({
  client: "mysql2",
  connection: {
    host: process.env.DB_HOST,
    port: process.env.DB_PORT,
    user: process.env.DB_USER,
    password: process.env.DB_PASSWORD,
    database: process.env.DB_DATABASE,
  },
});
We'll import this file into any file that needs to connect to the database.
        # 
        Get Data from the Database Server-Side
    
Inside a Next.js page like pages/index.tsx, import the db function from the
file we just created..
import { db } from "../lib/db";
Then create a getServerSideProps() function. Next.js will use this to get data
server-side and pass them as props to the page.
export async function getServerSideProps() {
  const message = await db("Message").first("text").where({ id: 1 });
  return {
    props: { message },
  };
};
Now, use the prop in the page's render function.
export default function Home({ message }) {
  return (
    <main>
      <h1>{message.text}</h1>
    </main>
  )
}
        # 
        Using a Raw Query
    
Knex has a built in raw() function that allows you to execute raw SQL.
Unfortunately, the format of the data returned by this function doesn't work
well with Next.js.
However, we can write a simple wrapper around it to help us.
Add the following to lib/db.ts.
export const raw = async (sql: string, bindings?: any) => {
  const result = await db.raw(sql, bindings);
  const data = result[0];
  const parsed = JSON.parse(JSON.stringify(data));
  return parsed.length === 1 ? parsed[0] : parsed;
};
Now on your page, you can import this function.
import { db, raw } from "../lib/db";
And you can use it to execute raw queries in getServerSideProps().
const message = await raw("SELECT text FROM Message WHERE id = 1 LIMIT 1;");