C++PyMysql 의 기본 기능 인 스 턴 스 상세 설명 실현

8537 단어 c + +pymysql
C++로 Thmisql 클래스 를 구현 하여 Python 표준 라 이브 러 리 PyMysql 의 기본 기능 을 구현 하고 PyMysql 과 유사 한 API 를 제공 하 며 pybid 11 로 Thmisql 을 Python 라 이브 러 리 로 봉 합 니 다.
PyMysql
Thmysql(C++)
Thmysql(Python)
connect
connect
connect
cursor
――
――
execute
execute
execute
fetchone
fetchone
fetchone
fetchall
fetchall
fetchall
close
close
close
개발 환경
  • Windows 64 비트 운영 체제;
  • mysql 5.5.28 for Win64(x86);
  • pycharm 2019.1.1。
  • 2.PyMysql 데이터베이스 조회
    
    #   :python_test.py
    import pymysql
    #   database
    conn = pymysql.connect(host="localhost",user="root",password="123456",
          database="test",charset="utf8")
    
    #         SQL       
    cursor = conn.cursor() #                  
    #   SQL  
    cursor.execute("use information_schema")
    
    cursor.execute("select version();")
    first_line = cursor.fetchone()
    print(first_line)
    
    cursor.execute("select * from character_sets;")
    res = cursor.fetchall()
    print(res)
    #       
    cursor.close()
    #        
    conn.close()

    개발 절차
  • my sql 설치 디 렉 터 리 의 include 와 lib 폴 더 를 procject 디 렉 터 리 에 복사 합 니 다.
  • lib 폴 더 의 libmy sql.dll 파일 을 system 32 경로 로 복사 합 니 다.
  • 은 MysqlInfo 구조 체 를 정의 하고 C++버 전의 Thmisql 류 를 실현 합 니 다.
  • 패키지 함수 작성 하기;
  • setuptools 를 통 해 C+코드 를 Python 라 이브 러 리 로 컴 파일 합 니 다.
  • 코드 구현
    
    //    :thmysql.h
    #include <Windows.h>
    #include "mysql.h"
    #include <iostream>
    #include <string>
    #include <vector>
    
    #pragma comment(lib, "lib/libmysql.lib")
    using namespace std;
    
    typedef struct MysqlInfo{
     string m_host;
     string m_user;
     string m_passwd;
     string m_db;
     unsigned int m_port;
     string m_unix_socket;
     unsigned long m_client_flag;
    
     MysqlInfo(){}
     MysqlInfo(string host, string user, string passwd, string db, unsigned int port,
         string unix_socket, unsigned long client_flag){
      m_host = host;
      m_user = user;
      m_passwd = passwd;
      m_db = db;
      m_port = port;
      m_unix_socket = unix_socket;
      m_client_flag = client_flag;
     }
    }MysqlInfo;
    
    class Thmysql{
     public:
      Thmysql();
      void connect(MysqlInfo&);
      void execute(string);
      vector<vector<string>> fetchall();
      vector<string> fetchone();
      void close();
     private:
      MYSQL mysql;
      MYSQL_RES * mysql_res;
      MYSQL_FIELD * mysql_field;
      MYSQL_ROW mysql_row;
      int columns;
      vector<vector<string>> mysql_data;
      vector<string> first_line;
    };
    //    :thmysql.cpp
    #include <iostream>
    #include "thmysql.h"
    
    Thmysql::Thmysql(){
     if(mysql_library_init(0, NULL, NULL) != 0){
      cout << "MySQL library initialization failed" << endl;
     }
     if(mysql_init(&mysql) == NULL){
      cout << "Connection handle initialization failed" << endl;
     }
    }
    
    void Thmysql::connect(MysqlInfo& msInfo){
     string host = msInfo.m_host;
     string user = msInfo.m_user;
     string passwd = msInfo.m_passwd;
     string db = msInfo.m_db;
     unsigned int port = msInfo.m_port;
     string unix_socket = msInfo.m_unix_socket;
     unsigned long client_flag = msInfo.m_client_flag;
    
     if(mysql_real_connect(&mysql, host.c_str(), user.c_str(), passwd.c_str(), db.c_str(),
      port, unix_socket.c_str(), client_flag) == NULL){
      cout << "Unable to connect to MySQL" << endl;
     }
    }
    
    void Thmysql::execute(string sqlcmd){
     mysql_query(&mysql, sqlcmd.c_str());
    
     if(mysql_errno(&mysql) != 0){
      cout << "error: " << mysql_error(&mysql) << endl;
     }
    }
    
    vector<vector<string>> Thmysql::fetchall(){
     //    sql        
     mysql_res = mysql_use_result(&mysql);
     //            
     columns = mysql_num_fields(mysql_res);
     //        
     mysql_field = mysql_fetch_fields(mysql_res);
     mysql_data.clear();
     while(mysql_row = mysql_fetch_row(mysql_res)){
      vector<string> row_data;
      for(int i = 0; i < columns; i++){
       if(mysql_row[i] == nullptr){
        row_data.push_back("None");
       }else{
        row_data.push_back(mysql_row[i]);
       }
      }
      mysql_data.push_back(row_data);
     }
     //   mysql_free_result       :Commands out of sync; you can't run this command now
     mysql_free_result(mysql_res);
     return mysql_data;
    }
    
    vector<string> Thmysql::fetchone(){
     //    sql        
     mysql_res = mysql_use_result(&mysql);
     //            
     columns = mysql_num_fields(mysql_res);
     //        
     mysql_field = mysql_fetch_fields(mysql_res);
     first_line.clear();
     mysql_row = mysql_fetch_row(mysql_res);
     for(int i = 0; i < columns; i++){
      if(mysql_row[i] == nullptr){
       first_line.push_back("None");
      }else{
       first_line.push_back(mysql_row[i]);
      }
     }
     mysql_free_result(mysql_res);
     return first_line;
    }
    
    void Thmysql::close(){
     mysql_close(&mysql);
     mysql_library_end();
    }
    
    //    :thmysql_wrapper.cpp
    #include "pybind11/pybind11.h"
    #include "pybind11/stl.h"
    #include "thmysql.h"
    
    namespace py = pybind11;
    
    PYBIND11_MODULE(thmysql, m){
     m.doc() = "C++  Mysql";
     py::class_<MysqlInfo>(m, "MysqlInfo")
      .def(py::init())
      .def(py::init<string, string, string, string, unsigned int, string, unsigned long>(),
        py::arg("host"), py::arg("user"), py::arg("passwd"), py::arg("db"),py::arg("port"),
        py::arg("unix_socket") = "NULL", py::arg("client_flag")=0)
      .def_readwrite("host", &MysqlInfo::m_host)
      .def_readwrite("user", &MysqlInfo::m_user)
      .def_readwrite("passwd", &MysqlInfo::m_passwd)
      .def_readwrite("db", &MysqlInfo::m_db)
      .def_readwrite("port", &MysqlInfo::m_port)
      .def_readwrite("unix_socket", &MysqlInfo::m_unix_socket)
      .def_readwrite("client_flag", &MysqlInfo::m_client_flag);
    
     py::class_<Thmysql>(m, "Thmysql")
      .def(py::init())
      .def("connect", &Thmysql::connect)
      .def("execute", &Thmysql::execute, py::arg("sql_cmd"))
      .def("fetchall", &Thmysql::fetchall)
      .def("fetchone", &Thmysql::fetchone)
      .def("close", &Thmysql::close);
    }
    #   :setup.py
    from setuptools import setup, Extension
    
    functions_module = Extension(
     name='thmysql',
     sources=['thmysql.cpp', 'thmysql_wrapper.cpp'],
     include_dirs=[r'D:\software\pybind11-master\include',
         r'D:\software\Anaconda\include',
         r'D:\project\thmysql\include'],
    )
    
    setup(ext_modules=[functions_module])
    
    
    5.Thmisql 데이터베이스 조회
    
    #   :test.py
    from thmysql import Thmysql, MysqlInfo
    
    info = MysqlInfo("localhost", "root", "123456", "", 3306)
    conn = Thmysql()
    #   database
    conn.connect(info)
    #   SQL  
    conn.execute("use information_schema")
    
    conn.execute("select version();")
    first_line = conn.fetchone()
    print(first_line)
    
    conn.execute("select * from character_sets;")
    res = conn.fetchall()
    print(res)
    #        
    conn.close()
    
    
     
    총결산
    C++PyMysql 의 기본 기능 을 실현 하 는 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 c+pymysql 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기