Pythonでデータベースを操作する方法


コンピュータの専门あるいはすでに仕事に参加した学友はすべて知っているべきで、1つのPythonの言语だけができるのは往々にして足りないので、データベースは私达の肝心な技能の1つで、本文は主にPythonがどのようにデータベース(Mysql)と简単なsql文に接続することを说明するためです.sqlに関する質問も、私との伝言交流を歓迎します.
 
ダウンロード
1.導入モジュールのインストール
  • インストールmysqlモジュール、windowsおよびubuntu
  •  
     
    Windowsにmysqlモジュールをインストールする
    Linuxにmysqlモジュールをインストールする
     
  • ファイルにモジュールを導入import pymysql
  • 2.Connectionオブジェクト
  • データベースへの接続の確立
  • 作成オブジェクト:呼び出しconnect()メソッドconn=connect(パラメータリスト)
  • パラメータhost:接続されたmysqlホスト、ネイティブが「localhost」
  • パラメータport:接続されたmysqlホストのポート、デフォルトは3306
  • パラメータdb:データベースの名前
  • パラメータuser:接続されたユーザー名
  • パラメータpassword:接続パスワード
  • パラメータcharset:通信で採用される符号化方式は、デフォルトでは「gb 2312」であり、データベース作成時に指定された符号化と一致することが要求される.そうしないと、中国語は文字化されない
  • 3.対象の方法
  • close()接続を閉じる
  • commit()トランザクションが有効になるには、コミットが必要です
  • rollback()トランザクション、破棄前のアクション
  • cursor()は、sql文を実行して結果を得るためにCursorオブジェクトを返します
  • Cursorオブジェクト
  • 実行sql文
  • オブジェクトの作成:Connectionオブジェクトを呼び出すcursor()メソッドcursor1=conn.cursor()
  • オブジェクトのメソッド
  • close()クローズ
  • execute(operation [, parameters ])実行文、影響を受ける行数
  • を返します.
  • fetchone()クエリー文を実行すると、クエリー結果セットの最初のローデータが取得され、メタグループ
  • が返されます.
  • next()クエリー文を実行すると、現在の行の次の行
  • を取得します.
  • fetchall()クエリーを実行すると、結果セットのすべての行が取得され、1行が1つのメタグループを構成し、これらのメタグループを1つのメタグループにロードして
  • に戻る
  • scroll(value[,mode])行ポインタをある位置に移動
  • mode移動を表す方式
  • modeのデフォルト値はrelativeで、現在の行に基づいてvalueに移動し、valueが正則的に下に移動し、valueが負の場合は上に移動することを示します.相対的
  • modeの値はabsoluteであり、第1のデータに基づく位置を示し、第1のデータの位置は0であり、絶対的である.

  • 例を挙げて分かりやすい
    #   python  mysql   
    import pymysql
    
    #       
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='python01', port=3306, charset='utf8')
    #       
    cur = conn.cursor()
    # sql  ,   
    #sql = 'select birthday from t_user'
    sql = 'select id,name,pwd,birthday from t_user'
    #   ,   。      ,        ,     ,       
    count = cur.execute(sql)
    print('      %s   '%count)
    
    #      
    dateOne = cur.fetchone()
    print(dateOne)
    
    #       
    cur.scroll(-1)
    
    #       
    cur.scroll(1)
    
    cur.scroll(1,mode='absolute')      ,        
    cur.scroll(1,mode='relative')      
    
    #        
    dataAll = cur.fetchall()
    print(dataAll)
    
    for temp in dataAll:
         print(temp)
         print(dataAll[-1][2])      #dataAll[-1]             ,dataAll[-1][2]          
    
    
    for temp in cur:
         print(temp)
    
    
    s = 'id:%s,name:%s,pwd:%s,birthday:%s'
    for temp in dataAll:
        print(s%(temp[0],temp[1],temp[2],temp[3]))
    
    #   
    cur.close()
    conn.close()
    

    4.オブジェクトのプロパティ
  • rowcount読取り専用属性は、前回execute()実行後に影響を受けた行数
  • を表す
  • 接続先取得
  •  
     
    添削して調べる.
     
    1.増加
  • testInsertを作成pyファイル、学生表にデータを挿入
  • #encoding=utf-8
    import pymysql
    try:
        conn=pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
        cs1=conn.cursor()
        count=cs1.execute("insert into students(sname) values('  ')")
        print(count)
        conn.commit()
        cs1.close()
        conn.close()
    except Exception,e:
        print(e)
    

    2.修正
  • testUpdateを作成する.pyファイル、学生表のデータを変更
  • #encoding=utf-8
    import pymysql
    try:
        conn=pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
        cs1=conn.cursor()
        count=cs1.execute("update students set sname='  ' where id=6")
        print(count)
        conn.commit()
        cs1.close()
        conn.close()
    except Exception,e:
        print(e)
    

    3.削除
  • testDeleteを作成する.pyファイル、学生表のデータを削除
  • #encoding=utf-8
    import pymysql
    try:
        conn=pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
        cs1=conn.cursor()
        count=cs1.execute("delete from students where id=6")
        print(count)
        conn.commit()
        cs1.close()
        conn.close()
    except Exception as e:
        print(e)
    

    4.調べる
  • testSelectOneを作成する.pyファイル、学生情報を検索
  •  
    import Pymysql
    try:
        conn=Pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
        cur=conn.cursor()
        cur.execute('select * from students where id=7')
        result=cur.fetchone()
        print result
        cur.close()
        conn.close()
    except Exception as e:
        print(e)
    

     
  • testSelectManyを作成する.pyファイル、すべての学生情報を検索
  •  
     
     
    #encoding=utf8
    import Pymysql
    try:
        conn=Pymysql.connect(host='localhost',port=3306,db='test1',user='root',passwd='mysql',charset='utf8')
        cur=conn.cursor()
        cur.execute('select * from students')
        result=cur.fetchall()
        print result
        cur.close()
        conn.close()
    except Exception as e:
        print(e)
    

    インスタンス1:パラメータ
    #   python  mysql   
    import pymysql
    import time
    
    #       
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='python01', port=3306, charset='utf8')
    #       
    cur = conn.cursor()
    # sql  ,   ,sql  
    sql = 'insert into t_user(name,pwd,birthday) values(%s,%s,%s)'
    #     
    name = input('    :')
    pwd = input('    :')
    birthday = input('    :')     # 2017 10 01 -->  struct_time(--->2017-10-01)
    birthday = time.strptime(birthday,'%Y %m %d ')      #                   (   MySQL  )
    
    params = [name,pwd,birthday]
    #   ,   。      ,        ,     ,       
    count = cur.execute(sql,params)
    #  
    conn.commit()
    print('      :%s'%count)
    #   
    cur.close()
    conn.close()
    

    例2:例外の放出
    #   python  mysql   
    import pymysql
    
    try:
        conn = None
        cur = None
        #       
        conn = pymysql.connect(host='127.0.0.1',
                               user='root',
                               password='123456',
                               database='python01',
                               port=3306,
                               charset='utf8')
        #     
        # a = 1 / 0
        #       
        cur = conn.cursor()
        # sql  ,   
        sql = 'insert into t_user(name,pwd,birthday) values("  ","123456",str_to_date("2017 10 20 ","%Y %m %d "))'
        #   ,   。      ,        ,     ,       
        count = cur.execute(sql)
        #   
        conn.commit()
        print('      :%s' % count)
    except Exception as ex:
        #       ,      ,    ,  
        print(str(ex))
        #        
        # raise
    finally:
        if cur != None:
            cur.close()
        if conn != None:
            conn.close()
    

    例3:
    #   python  mysql   
    import pymysql
    
    #       
    conn = pymysql.connect(host='127.0.0.1', user='root', password='123456', database='python01', port=3306, charset='utf8')
    #       
    cur = conn.cursor()
    # sql  ,   
    #sql = 'select birthday from t_user'
    sql = 'select id,name,pwd,birthday from t_user'
    #   ,   。      ,        ,     ,       
    count = cur.execute(sql)
    print('      %s   '%count)
    
    #      
    # dateOne = cur.fetchone()
    # print(dateOne)
    
    
    # for temp in cur:
    #     print(temp)
    
    
    s = 'id:%s,name:%s,pwd:%s,birthday:%s'
    for temp in dataAll:
        print(s%(temp[0],temp[1],temp[2],temp[3]))
    
    #   
    cur.close()
    conn.close()

     
    パッヶージ
     
    呼び出しのたびに簡単にpyファイルをカプセル化できます.このライブラリをmySqlHelperと定義します.
    """
    python  mysql         
    
    1、   ,    
    2、  
    
        
    1、      
    2、sql    ,    
    3、      
    """
    
    import pymysql
    
    class MysqlHelper:
        '''python  mysql        '''
    
        def __init__(self, host, user, password, database, port=3306, charset='utf8'):
            '''
                 
            :param host:          
            :param user:           
            :param password:      
            :param database:       
            :param port:           ,   3306
            :param charset:       ,   utf8
            '''
            self.host = host
            self.port = port
            self.database = database
            self.user = user
            self.password = password
            self.charset = charset
    
        def connect(self):
            '''
                       
            :return:
            '''
            self.conn = pymysql.connect(host=self.host,
                                        user=self.user,
                                        password=self.password,
                                        database=self.database,
                                        port=self.port,
                                        charset=self.charset)
    
            self.cur = self.conn.cursor()
    
        def fetchone(self, sql, params=None):
            '''
               sql         
           :param sql:          sql  
           :param params:       sql         ,    None
           :return:                    
           '''
            dataOne = None
            try:
                count = self.cur.execute(sql, params)
                if count != 0:
                    dataOne = self.cur.fetchone()
            except Exception as ex:
                print(ex)
            finally:
                self.close()
            return dataOne
    
        def fetchall(self, sql, params=None):
            '''
               sql         
           :param sql:          sql  
           :param params:       sql         ,    None
           :return:                    
           '''
            dataall = None
            try:
                count = self.cur.execute(sql, params)
                if count != 0:
                    dataall = self.cur.fetchall()
            except Exception as ex:
                print(ex)
            finally:
                self.close()
            return dataall
    
        def __item(self, sql, params=None):
            '''
                 
            :param sql:           sql  
            :param params:        sql         ,    None
            :return:                    
            '''
            count = 0
            try:
                count = self.cur.execute(sql, params)
                self.conn.commit()
            except Exception as ex:
                print(ex)
            finally:
                self.close()
            return count
    
        def update(self, sql, params=None):
            '''
                
            :param sql:     sql  
            :param params:  sql         ,    None
            :return:              
            '''
            return self.__item(sql, params)
    
        def insert(self, sql, params=None):
            '''
                
            :param sql:     sql  
            :param params:  sql         ,    None
            :return:              
            '''
            return self.__item(sql, params)
    
        def delete(self, sql, params=None):
            '''
                
            :param sql:     sql  
            :param params:  sql         ,    None
            :return:              
            '''
            return self.__item(sql, params)
    
        def close(self):
            '''
                       
            '''
            if self.cur != None:
                self.cur.close()
            if self.conn != None:
                self.conn.close()
    

     
    テスト
     
    1.クエリーの複数のデータのテスト
    import mysqlHelper
    
    #      
    helper = mysqlHelper.MysqlHelper('127.0.0.1', 'root', '123456', 'python01')
    #   
    helper.connect()
    # sql
    sql = 'select * from t_user where name = %s and id > %s'
    # params
    params = ['  ',1]
    #   
    data = helper.fetchall(sql, params)
    #   
    if data:
        for temp in data:
            print(temp)
    else:  # None,False,0
        print('    .')
    
    helper.close()
    

    2.クエリーデータのテスト
    import mysqlHelper
    
    #      
    helper = mysqlHelper.MysqlHelper('127.0.0.1', 'root', '123456', 'python01')
    #   
    helper.connect()
    # sql
    sql = 'select * from t_user where id = %s'
    #sql = 'select * from t_user where id = 1'
    # params
    params = [2]
    #   
    data = helper.fetchone(sql, params)
    #data = helper.fetchone(sql)
    #   
    if data:
        print(data)
    else:  # None,False,0
        print('    .')
    

    3.テスト添削
    import mysqlHelper
    import time
    
    #      
    helper = mysqlHelper.MysqlHelper('127.0.0.1', 'root', '123456', 'python01')
    #   
    helper.connect()
    # sql
    sql = 'update t_user set name =%s,pwd=%s,birthday=%s where id=%s'
    # params
    id = input('    :')
    name = input('    :')
    pwd = input('    :')
    birthday = time.strptime(input('    :'), '%Y %m %d ')
    params = [name, pwd, birthday,id]
    #   
    count = helper.update(sql, params)
    #   
    if count:
        print('    .')
    else:  # None,False,0
        print('    .')
    

    4.簡単なログインと登録
    プロジェクトをするときにログインや登録を試みるときにパスワードを暗号化して保存し、sql文と組み合わせて簡単なインタラクションを行う必要があります.
    注意:
  • パスワードを暗号化する必要がある
  • md 5暗号化を使用する場合、パスワードには32文字
  • が含まれます.
  • sha 1暗号化を使用する場合、パスワードには40文字が含まれます.ここでは、この方法
  • を使用します.
    create table userinfos(
        id int primary key auto_increment,
        uname varchar(20),
        upwd char(40),
        isdelete bit default 0
    );
    
    /*
    ret = doPwd('123')
    print(ret)
      :40bd001563085fc35165329ea1ff5c5ecbdbbeef
                  */
    
    --       ,    123,   123,  sha1     
    insert into userinfos 
    values(1,'123','40bd001563085fc35165329ea1ff5c5ecbdbbeef',0);
    

    ログインと登録
    import hashlib
    from mysqlHelper import MysqlHelper
    
    def login():
        '''  '''
        name = input('     :')
        pwd = input('    :')
        #  
        pwd = doPwd(pwd)
    
        helper = MysqlHelper('127.0.0.1', 'root', '123456', 'python01')
        helper.connect()
        sql = 'select * from t_user where name=%s and pwd=%s'
        params = [name, pwd]
        data = helper.fetchone(sql, params)
        if data:
            print('    .')
        else:  # None,False,0
            print('    .')
    
    
    def doPwd(pwd):
        '''sha1  '''
        mysha1 = hashlib.sha1()
        mysha1.update(pwd.encode('utf-8'))
        pwd = mysha1.hexdigest()
        return pwd
    
    
    def register():
        '''  '''
        name = input('     :')
        pwd = input('    :')
        #   
        pwd = doPwd(pwd)
    
    
        helper = MysqlHelper('127.0.0.1', 'root', '123456', 'python01')
        helper.connect()
        sql = 'insert into t_user(name,pwd) values(%s,%s)'
        params = [name, pwd]
        count = helper.insert(sql, params)
        if count:
            print('    .')
        else:  # None,False,0
            print('    .')
    
    
    if __name__ == '__main__':
        #register()
        login()
    

    実際のプロジェクトのログイン登録には様々な検証が加わることが多いが、ここのコードは簡単なログイン登録であり、コミュニケーションを学ぶためだけである.