¿Cómo conectarse a MySQL desde un programa en C?

La respuesta al título de esta publicación es muy sencilla, conectarse a MySQL desde C se realiza mediante una API provista por el mismo proveedor de base de datos.

La API de C es ditribuida con MySQL, no es más que una librería (libmysqlclient) que interfacea entre el programa y la base de datos.

La documentación provista por MySQL es muy completa (MySQL C API), no obstante, fiel a nuestra costumbre iremos a un ejemplo sencillo y concreto.

¿Qué necesitamos?

  • Un servidor de base de datos MySQL, al cual conectarnos
  • Un programa cliente
  • La librería mysqlclient
  • mysql-devel, headers con la firma de la librería
  • gcc

Con cualquier variante de UNIX más la instalación manual de la distribución binaria (tar.gz) tendremos todo lo que necesitamos. Caso contrario habrá que instalar los paquetes necesarios que incluya los requisitos mencionados, por ejemplo mysql-devel.

Primero, sin ir al detalle en concreto de cada línea (no cuesta nada interpretar el código, pues está bien comentado) veamos el siguiente fuente:

[C]
/* mi_cliente */
#include
#include

main() {
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW row;

char *server = “localhost”;
char *user = “root”;
char *password = “PASSWORD”; /* set me first */
char *database = “mysql”;

conn = mysql_init(NULL);

/* Connect to database */
if (!mysql_real_connect(conn, server,
user, password, database, 0, NULL, 0)) {
fprintf(stderr, “%s\n”, mysql_error(conn));
exit(1);
}

/* send SQL query */
if (mysql_query(conn, “show tables”)) {
fprintf(stderr, “%s\n”, mysql_error(conn));
exit(1);
}

res = mysql_use_result(conn);

/* output table name */
printf(“MySQL Tables in mysql database:\n”);
while ((row = mysql_fetch_row(res)) != NULL)
printf(“%s \n”, row[0]);

/* close connection */
mysql_free_result(res);
mysql_close(conn);
}
[/C]

Ahora si veamos la parte más interesa saber ¿cómo compilar?

Entre los argumentos a pasarle al gcc tenemos los directorios con las librerías, las librerías propiamente dichas, los directorios de encabezados (.h), y otras opciones más del compilador. Esto no representa ningún problema, menos aún con mysql_config  es un pequeño utilitario de MySQL que provee información para el compilador.

De esta forma:

  • mysql_config –libs: devuelve los path de las librerías y las librerías propiamente dichas a linkear.
  • mysql_config –cflags: devuelve, entre otros argumentos, los path de los headers.

Finalmente, podemos compilar de esta manera tan sencilla:

$ gcc -o mi_cliente $(mysql_config --cflags) mi_cliente.c $(mysql_config --libs)

Y luego ejecutar:

$ ./mi_cliente

Realmente, muy sencillo ¿no?

Vía: nixCraft

Tags: , , , ,


  • Pastor

    Amigo segui exactamente los pasos, pero me da este error, y he buscado, pero no se que quiere decir:

    [pastor@paganini ~]$ ./mi_cliente
    Can’t connect to local MySQL server through socket ‘/var/lib/mysql/mysql.sock’ (2)
    MySQL server has gone away
    MySQL Tables in mysql database:
    Violación de segmento (`core’ generado)
    [pastor@paganini ~]$

    Gracias, y muy interesante post!

    Reply

    • Alex_HG

      Tu post es muy viejo y tal vez ya lo hayas solucionado pero el error se debe a que que MySQL no esta configurado correctamente. Si aun te sirve, puedes consultar el siguiente enlace “http://www.basicconfig.com/linuxservers/setup_configure_mysql_slackware”, es para la distrio de Slackware y derivados, pero me imagino que debe funcionar igual para cualquier otra distro.

      Reply

Leave a Reply

Your email address will not be published. Required fields are marked *