#include<gflags/gflags.h>
#include<odb/database.hxx>
#include<odb/mysql/database.hxx>
#include"student_classes.hxx"
#include"student_classes-odb.hxx"
DEFINE_string(host,"127.0.0.1","主机号");
DEFINE_uint32(port,0,"端口号");
DEFINE_string(db,"qsy_test","mysql 数据库名");
DEFINE_string(user,"root","mysql 用户名");
DEFINE_string(pswd,"<password>","mysql 用户密码");
DEFINE_string(cset,"utf8","mysql 客户端字符集");
DEFINE_int32(max_pool,3,"最大的连接池数");
void insert_student(odb::mysql::database &db) {
try {
odb::transaction trans(db.begin());
Student s1(1,"张三",18,1);
Student s2(2,"李四",19,1);
Student s3(3,"王五",17,1);
Student s4(4,"赵六",21,2);
Student s5(5,"田七",20,2);
Student s6(6,"孙八",16,2);
Student s7(7,"罗九",26,2);
db.persist(s1);
db.persist(s2);
db.persist(s3);
db.persist(s4);
db.persist(s5);
db.persist(s6);
db.persist(s7);
trans.commit();
} catch(std::exception &e) {
std::cout << "数据插入失败:" << e.what() << std::endl;
}
}
void insert_classes(odb::mysql::database& db) {
try {
odb::transaction trans(db.begin());
Classes c1("1 班");
Classes c2("2 班");
db.persist(c1);
db.persist(c2);
trans.commit();
} catch(const std::exception& e) {
std::cout << "数据插入失败" << e.what() << '\n';
}
}
void remove_student(odb::mysql::database &db) {
try {
odb::transaction trans(db.begin());
typedef odb::query<Student> query;
db.erase_query<Student>(query::id == 4);
trans.commit();
} catch(const std::exception &e) {
std::cerr << "删除失败:" << e.what() << '\n';
}
}
Student select_student(odb::mysql::database &db) {
Student ret;
try {
odb::transaction trans(db.begin());
typedef odb::query<Student> query;
typedef odb::result<Student> result;
result r(db.query<Student>(query::name == "张三"));
if(r.size()!=1) {
std::cout << "查询失败" << std::endl;
return Student();
}
ret = *r.begin();
trans.commit();
} catch(const std::exception &e) {
std::cerr << "查询失败" << e.what() << '\n';
}
return ret;
}
void select_student_classes(odb::mysql::database& db) {
try {
odb::transaction trans(db.begin());
typedef odb::query<struct classes_student> query;
typedef odb::result<struct classes_student> result;
result r(db.query<struct classes_student>(query::classes::id==1));
for(auto it = r.begin();it!=r.end();it++){
std::cout<<it->name<<" ";
std::cout<<it->age<<" ";
std::cout<<it->sn<<" ";
std::cout<<it->classes_name<<" ";
std::cout<<std::endl;
}
trans.commit();
} catch(const std::exception &e) {
std::cout << "查询失败:" << e.what() << std::endl;
}
}
void update_student(odb::mysql::database &db, Student &stu) {
try {
odb::transaction trans(db.begin());
db.update(stu);
trans.commit();
} catch(const std::exception &e) {
std::cerr << "更新失败:" << e.what() << '\n';
}
}
int main(int argc,char*argv[]) {
google::ParseCommandLineFlags(&argc,&argv, true);
std::unique_ptr<odb::mysql::connection_pool_factory>cpf(
new odb::mysql::connection_pool_factory(FLAGS_max_pool,0));
odb::mysql::database db(FLAGS_user, FLAGS_pswd, FLAGS_db, FLAGS_host, FLAGS_port,"", FLAGS_cset,0, std::move(cpf));
select_student_classes(db);
return 0;
}