v/vlib/db/mysql
2025-06-27 02:25:13 +03:00
..
_cdefs.c.v db: mysql,pg,sqlite add transaction support (fix #24290) (#24352) 2025-04-29 09:10:13 +03:00
_cdefs_nix.c.v db.mysql: add support for the FreeBSD name of the mariadb client library (#20039) 2023-11-30 15:32:44 +02:00
_cdefs_windows.c.v
consts.c.v db.mysql: use hardcoded const declare (fix #22086) (#24162) 2025-04-09 07:32:17 +03:00
enums.v fmt: fix alignment of enumeration types (#21999) 2024-08-07 15:46:50 +03:00
mysql.c.v db: modify mysql/pg/sqlite interface for pool working (#24780) 2025-06-27 02:25:13 +03:00
mysql_orm_test.v db: modify mysql/pg/sqlite interface for pool working (#24780) 2025-06-27 02:25:13 +03:00
mysql_test.v db: modify mysql/pg/sqlite interface for pool working (#24780) 2025-06-27 02:25:13 +03:00
orm.c.v breaking,orm: add table attrs; add table/field comment support for mysql and pg (#24744) 2025-06-18 10:20:09 +03:00
pool.v db: modify mysql/pg/sqlite interface for pool working (#24780) 2025-06-27 02:25:13 +03:00
prepared_stmt_test.v tools: cleanup entries from the hardcoded skip_files list in common.v (used by v test, v test-self etc); use the new // vtest build: syntax to mark the tests instead (#23918) 2025-03-13 19:51:51 +02:00
README.md db: mysql,pg,sqlite add transaction support (fix #24290) (#24352) 2025-04-29 09:10:13 +03:00
result.c.v json: fix option time (fix #24242) (fix #24175) (#24243) 2025-04-17 14:45:04 +03:00
stmt.c.v json: fix option time (fix #24242) (fix #24175) (#24243) 2025-04-17 14:45:04 +03:00
utils.c.v all: update attributes to use new syntax 2023-11-15 16:16:01 +11:00

Purpose:

The db.mysql module can be used to develop software that connects to the popular open source MySQL or MariaDB database servers.

Local setup of a development server:

To run the mysql module tests, or if you want to just experiment, you can use the following command to start a development version of MySQL using docker:

docker run -p 3306:3306 --name some-mysql -e MYSQL_ALLOW_EMPTY_PASSWORD=1 -e MYSQL_ROOT_PASSWORD= -d mysql:latest

The above command will start a server instance without any password for its root account, available to mysql client connections, on tcp port 3306.

You can test that it works by doing: mysql -uroot -h127.0.0.1 . You should see a mysql shell (use exit to end the mysql client session).

Use docker container stop some-mysql to stop the server.

Use docker container rm some-mysql to remove it completely, after it is stopped.

Installation of development dependencies:

For Linux, you need to install MySQL development package and pkg-config.

For Windows, install the installer , then copy the include and lib folders to <V install directory>\thirdparty\mysql.

Troubleshooting

If you encounter weird errors (your program just exits right away, without printing any messages, even though you have println('hi') statements in your fn main()), when trying to run a program that does import db.mysql on windows, you may need to copy the .dll file: thirdparty/mysql/lib/libmysql.dll, into the folder of the executable too (it should be right next to the .exe file).

This is a temporary workaround, until we have a more permanent solution, or at least more user friendly errors for that situation.

Basic Usage

import db.mysql

// Create connection
config := mysql.Config{
	host:     '127.0.0.1'
	port:     3306
	username: 'root'
	password: '12345678'
	dbname:   'mysql'
}

// Connect to server
mut db := mysql.connect(config)!
// Do a query
res := db.query('select * from users')!
rows := res.rows()
for row in rows {
	println(row.vals)
}
// Close the connection if needed
db.close()

Transaction

import db.mysql

// Create connection
config := mysql.Config{
	host:     '127.0.0.1'
	port:     3306
	username: 'root'
	password: '12345678'
	dbname:   'mysql'
}

mut db := mysql.connect(config)!
// turn off `autocommit` first
db.autocommit(false)!
// begin a new transaction
db.begin()!
mut result_code := db.exec_none('insert into users (username) values ("tom")')
assert result_code == 0
// make a savepoint
db.savepoint('savepoint1')!
result_code = db.exec_none('insert into users (username) values ("kitty")')
assert result_code == 0
// rollback to `savepoint1`
db.rollback_to('savepoint1')!
result_code = db.exec_none('insert into users (username) values ("mars")')
assert result_code == 0
db.commit()!
res := db.query('select * from users')!
rows := res.rows()
dump(rows)
// Close the connection if needed
db.close()