系统为Ubuntu16.04LTS,MySQL版本为5.7,QT版本为5.12.9
sudo apt-get install mysql-server //服务端
sudo apt-get install mysql-client //客户端
sudo apt-get install libmysqlclient-dev //程序编译时链接的库
安装过程中会弹出窗口,设置MySQL root密码,由于MySQL只有一个root用户,因此每次使用MySQL都需要输入这个root密码。
完成后dpkg -l | grep mysql
查看安装状态
如果是这样的就是安装成功了
service mysql start
需要输入数据库root密码,MySQL只有一个用户root
启动后使用如下命令查看:sudo netstat -anp | grep mysql
语法格式为
mysql -u用户名 -p密码 < 要导入的数据库数据(runoob.sql)
mysql -u root -p
需要输入root密码,启动成功后如下
show global variables like ‘port‘;
CREATE DATABASE test_db;
创建一个名为test_db的库
MySQL 不允许在同一系统下创建两个相同名称的数据库。
可以加上IF NOT EXISTS从句,就可以避免类似错误,如下所示:
mysql> CREATE DATABASE IF NOT EXISTS test_db;
选中数据库mysql> test_db
设置编码格式为UTF-8mysql> set names utf8;
方法一:
mysql>source /home/abc/abc.sql;
方法二:
mysql -u用户名 -p密码 数据库名 < 数据库名.sql
#mysql -uabc_f -p abc < abc.sql
语法格式:
CREATE TABLE table_name (column_name column_type);
CREATE TABLE temperatureHumidityRecord(
createtime DATE,
temprature DOUBLE,
humidity DOUBLE
)ENGINE=InnoDB DEFAULT CHARSET=utf8;
以下为向MySQL数据表插入数据通用的 INSERT INTO SQL语法:
INSERT INTO table_name ( field1, field2,…fieldN )
VALUES
( value1, value2,…valueN );
如果数据是字符型,必须使用单引号或者双引号,如:“value”。
例如:
INSERT INTO temperatureHumidityRecord
(createtime,temprature,humidity)
VALUES
(NOW(),34.32,12.45);
语法格式:
“ALTER TABLE <表名> MODIFY <字段名> <新数据类型>”。
语法格式:
DELETE FROM <表名> [WHERE 子句] [ORDER BY 子句] [LIMIT 子句]
语法说明如下:
<表名>:指定要删除数据的表名。
ORDER BY 子句:可选项。表示删除时,表中各行将按照子句中指定的顺序进行删除。
WHERE 子句:可选项。表示为删除操作限定删除条件,若省略该子句,则代表删除该表中的所有行。
LIMIT 子句:可选项。用于告知服务器在控制命令被返回到客户端前被删除行的最大值
删除所有:
service mysql stop
service mysqld status
MySQL未工作
运行中
安装时未设置root无法登录SQL参考这篇博客
Linux下安装mysql及qt连接
Qt 支持很多种常见的数据库,如 MySQL、Oracle、MS SQL Server、SQLite 等。Qt SQL 模块里包含了很多个类,可以轻松实现数据库的连接、执行 SQL 语句,获取数据库里的数据与界面显示等功能,一般数据与界面之间会采用 Model/View架构,从而很方便的显示数据界面和操作数据库。
在 QSqlDatabase 连接数据库后,用 QSqlTableModel 从数据库里读取出表格模型,然后通过 Qt 的 QTableView 类显示数据库的内容在我们面前。需要对数据库的数据进行修改可以使用 QSqlQuery,或者直接修改QSqlTableModel 对象,修改里面的模型数据即可,流程如下:
源代码如下,main.cpp
#include "mainwindow.h"
#include
void loadMySqlDriver();
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
mainwindows.cpp:
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
/*
*链接mysql数据库
*/
QSqlDatabase db(QSqlDatabase::addDatabase("QMYSQL"));
db.setHostName("127.0.0.1");
db.setDatabaseName("test");
db.setUserName("root");
db.setPassword("zjz123");
db.setPort(3306);
if(!db.open()){
qDebug()<<db.lastError();
}
else
{
qDebug()<<"connect success";
}
}
MainWindow::~MainWindow()
{
delete ui;
}
这个时候是无法连接的,会出现如下报错
Qt虽然支持直接连接MySQL,但是并没有将插件直接编译好,QT库对于MySQL的支持库的编译需要依赖MySQL安装时所生成的底层库,是因为MySQL版本不一样,安装时所产生的底层库也会有所区别,编译出来的插件也不一样,需要用户安装MySQL后手动编译。
进入QT源码目录,找到mysql支持库源码
1、依赖包安装:
sudo apt-get install openssl
sudo apt-get install libssl-dev
2、修改.pro文件,路径为
/opt/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/mysql
在QT安装目录下的Src/qtbase/src/plugins/sqldrivers/mysql
打开pro文件,将QMAKE_USE
注释掉
TARGET = qsqlmysql
HEADERS += $$PWD/qsql_mysql_p.h
SOURCES += $$PWD/qsql_mysql.cpp $$PWD/main.cpp
#QMAKE_USE += mysql
OTHER_FILES += mysql.json
PLUGIN_CLASS_NAME = QMYSQLDriverPlugin
include(../qsqldriverbase.pri)
3、返回上一层目录,找到qsqldriverbase.pri文件,打开
将·nclude($$shadowed($$PWD)/qtsqldrivers-config.pri)
注释掉并添加include($$shadowed($$PWD)/configure.pri)
include($$shadowed($$PWD)/configure.pri)
QT = core core-private sql-private
# For QMAKE_USE in the parent projects.
#include($$shadowed($$PWD)/qtsqldrivers-config.pri)
include($$shadowed($$PWD)/configure.pri)
PLUGIN_TYPE = sqldrivers
load(qt_plugin)
DEFINES += QT_NO_CAST_TO_ASCII QT_NO_CAST_FROM_ASCII
4、进行qmkae生成makefile
sudo /opt/Qt5.12.9/5.12.9/gcc_64/bin/qmake "INCLUDEPATH+=/usr/include/mysql" "LIBS+=-L/usr/lib/x86_64-linux-gnu/ -lmysqlclient" mysql.pro
5、编译依赖库
/opt/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/mysql$ sudo make
6、拷贝依赖库
编译完成后将生成的库重新拷贝覆盖原有的库:
/opt/Qt5.12.9/5.12.9/Src/qtbase/src/plugins/sqldrivers/plugins/sqldrivers$ sudo cp * /opt/Qt5.12.9/5.12.9/gcc_64/plugins/sqldrivers/ -rf
这样就可以连接上MySQL了
支持库加载上了以后,如果出现了这个错误,是因为要连接的数据库不存在,需要先创建对应的数据库
如果连接成功,则会输出调试信息”connect success”
与MySQL的连接测试完成
mainwindows.h:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
private slots:
void on_pushButton_add_clicked();
void on_pushButton_actSubmit_clicked();
void on_pushButton_actRevert_clicked();
void on_pushButton_delete_clicked();
private:
Ui::MainWindow *ui;
QSqlDatabase db;//数据库连接
QSqlTableModel *tabModel;//数据模型
QItemSelectionModel *theSelection; //选择模型
QDataWidgetMapper *dataMapper;//数据映射
private:
void openDataBase();
void openTable();
};
#endif // MAINWINDOW_H
mainwindows.cpp:
需要注意的是,程序中将数据的提交策略使用setSubmitPolicy()设置为ManualSubmit(手动提交),数据的修改会暂时缓存,等待用户调用submitAll()保存所有修改,或是调用revertAll()取消所有未保存修改
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
openDataBase();
}
MainWindow::~MainWindow()
{
delete ui;
}
void MainWindow::openDataBase()
{
/*链接mysql数据库*/
//QSqlDatabase db(QSqlDatabase::addDatabase("QMYSQL"));
db = QSqlDatabase::addDatabase("QMYSQL");
db.setHostName("127.0.0.1");
db.setDatabaseName("test_db");
db.setUserName("root");
db.setPassword("123456");
db.setPort(3306);
if(!db.open()){
qDebug()<<QString("connect database error")<<db.lastError();
}
else
{
qDebug()<<"connect success";
}
openTable();
}
void MainWindow::openTable()
{
/*打开数据表*/
tabModel = new QSqlTableModel(this,db);
tabModel->setTable("temperatureHumidityRecord");
tabModel->setSort(tabModel->fieldIndex("createtime"),Qt::AscendingOrder);
tabModel->setEditStrategy(QSqlTableModel::OnManualSubmit);//所有修改暂时缓存,不立刻更新到数据库内
if(!(tabModel->select())){
qDebug()<<"open table error"<<tabModel->lastError();
return;
}else{
qDebug()<<"open table success";
}
/*设置字段显示*/
tabModel->setHeaderData(tabModel->fieldIndex("createtime"),Qt::Horizontal,"时间");
tabModel->setHeaderData(tabModel->fieldIndex("temprature"),Qt::Horizontal,"温度");
tabModel->setHeaderData(tabModel->fieldIndex("humidity"),Qt::Horizontal,"湿度");
/*选择模型*/
theSelection = new QItemSelectionModel(tabModel);
/*tableView控件设置*/
ui->tableView->setModel(tabModel);//设置数据模型
ui->tableView->setSelectionModel(theSelection);//设置选择模型
/*创建界面组件与数据模型字段之间的数据映射*/
dataMapper = new QDataWidgetMapper();
dataMapper->setModel(tabModel);
dataMapper->setSubmitPolicy(QDataWidgetMapper::AutoSubmit);
}
/*
* 添加
*/
void MainWindow::on_pushButton_add_clicked()
{
tabModel->insertRows(tabModel->rowCount(),1);
QModelIndex curIndex = tabModel->index(tabModel->rowCount()-1,1);
theSelection->clear();
theSelection->setCurrentIndex(curIndex,QItemSelectionModel::Select);
int curRow = curIndex.row();
if(ui->textEdit_humidity->toPlainText().isNull() ||
ui->textEdit_temprature->toPlainText().isNull()){
QMessageBox::information(this,"","添加失败");
return;
}
//当前时间
tabModel->setData(tabModel->index(curRow,tabModel->fieldIndex("createtime")),
QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss"));
tabModel->setData(tabModel->index(curRow,tabModel->fieldIndex("temprature")),
ui->textEdit_temprature->toPlainText().toDouble());
tabModel->setData(tabModel->index(curRow,tabModel->fieldIndex("humidity")),
ui->textEdit_humidity->toPlainText().toDouble());
}
/*
* 确认修改
*/
void MainWindow::on_pushButton_actSubmit_clicked()
{
bool res = tabModel->submitAll();
if(!res){
QMessageBox::information(this,"","修改失败");
}
}
/*
* 取消修改
*/
void MainWindow::on_pushButton_actRevert_clicked()
{
tabModel->revertAll();
}
/*
* 删除
*/
void MainWindow::on_pushButton_delete_clicked()
{
QModelIndex curIndex = theSelection->currentIndex();
tabModel->removeRows(curIndex.row(),1);
}