天天看點

python操作mysql資料庫

一、環境依賴

1、安裝mysqlclient子產品

#下載下傳mysqlclient包
進入https://www.lfd.uci.edu/~gohlke/pythonlibs/#mysqlclient進行下載下傳

#在對應的虛拟環境中進行安裝
(automatic) C:\Users\Administrator>pip install E:\python\mysqlclient-1.4.2-cp35-
cp35m-win_amd64.whl
Processing e:\python\mysqlclient-1.4.2-cp35-cp35m-win_amd64.whl
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.4.2      

2、檢查是否安裝成功

#在虛拟環境中打開python導入對應子產品,看是否成功
(automatic) C:\Users\Administrator>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import MySQLdb #導入成功
>>>      

更多參考:https://mysqlclient.readthedocs.io/user_guide.html#installation

 二、python操作mysql

python操作mysql資料庫
python操作mysql資料庫
class MetaSingleTon(type):

    _instance = {}

    def __call__(self, *args, **kwargs):  # self指代的是傳過來的類 MysqlDataBase
        if self not in self._instance:
            self._instance[self] = super(
                MetaSingleTon, self).__call__(
                *args, **kwargs)
        return self._instance[self]      

mysql單例模式

python操作mysql資料庫
python操作mysql資料庫
import MySQLdb
class MysqlDataBase(metaclass=MetaSingleTon):

    connection = None

    def connect(self):
        if self.connection is None:
            self.connection = MySQLdb.connect(
                host="localhost",
                port=3306,
                user="root",
                # password="123456",
                db="yw_crm",
                charset='utf8')
            self.cursor = self.connection.cursor()
        return self.cursor

    def excute_query_one_data(self):
        """
               1、準備sql語句
               2、找到cursor
               3、執行sql語句
               4、拿到結果
               5、處理資料
               #關閉cursor和conn
               :return:擷取單條資料
        """
        sql = "select * from crm_userinfo"
        self.connect().execute(sql)
        # result=self.connect().fetchone()#擷取的是元組資料
        result = dict(zip([k[0] for k in self.connect().description],
                          self.connect().fetchone()))  # 将資料處理為字典格式

        self.connect().close()
        self.close()
        return result

    def excute_query_more_data(self, page, page_size):
        """
               1、準備sql語句
               2、找到cursor
               3、執行sql語句
               4、拿到結果
               5、處理資料
               #關閉cursor和conn
               :return:擷取多條資料
        """
        offset = (page - 1) * page_size
        sql = 'SELECT * FROM crm_userinfo WHERE id>1 ORDER BY id DESC LIMIT %s, %s;'
        cursor = self.connect()
        cursor.execute(sql, (offset, page_size))
        result = [dict(zip([k[0] for k in cursor.description], row))
                  for row in cursor.fetchall()]  # 将資料處理為字典格式
        self.close()
        return result

    def excute_add_data(self):
        # 準備sql
        try:
            sql = (
                "INSERT INTO `crm_userinfo` (`username`,`password`,`email`,`name`,`phone`,`gender`,`department_id`) VALUE "
                "( %s, %s, %s, %s, %s,%s,%s );")

            # 擷取連接配接和cursor
            cursor = self.connect()
            # 執行sql
            cursor.execute(
                sql, ('王豔', '5689', '[email protected]', '王豔', '25412365', 2, 9))
            # 送出事務
            self.connection.commit()
            # 關閉cursor
            cursor.close()
        except BaseException:
            self.connection.rollback()  # 上面有事務送出,如果出現異常,所有的全部復原,要麼都成功,要麼都失敗
        self.connection.close()

    def close(self):
        self.connect().close()
        self.connection.close()


def main():
    db = MysqlDataBase()  # 無論建立多少個資料庫執行個體,其結果所有執行個體的位址都相同

    # result=db.excute_query_one_data()
    # print(result)
    # print(result["username"])

    ###分頁輸出###
    # result=db.excute_query_more_data(2,3)
    # for item in result:
    #     print(item)

    # 添加資料
    # db.excute_add_data()


if __name__ == '__main__':
    main()      

python操作mysql

三、ORM操作

1、sqlalchemy安裝

#進入虛拟環境進行安裝
(automatic) C:\Users\Administrator>pip install SQLALchemy      

2、檢測是否安裝成功

#進入python,導入對應的包

(automatic) C:\Users\Administrator>python
Python 3.5.2 (v3.5.2:4def2a2901a5, Jun 25 2016, 22:18:55) [MSC v.1900 64 bit (AM
D64)] on win32
Type "help", "copyright", "credits" or "license" for more information.
>>> import sqlalchemy
>>>      

3、模型介紹

(1)資料類型

python操作mysql資料庫

(2)建立模型

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base): #Base是基類
    """
    建立資料庫表模型
    """
    __tablename__ = 'crm_userinfo' #表示建立的表名

    id = Column(Integer, primary_key=True)
    username = Column(String(32))
    password = Column(String(64))
    email = Column(String(32))
    name = Column(String(32))
    phone = Column(String(32))
    gender = Column(Integer)
    department_id = Column(Integer)      

當然,建立模型表後需要在資料庫中生成表:

engine = create_engine("mysql://root:@127.0.0.1:3306/user_orm?charset=utf8") #連接配接資料庫

Base.metadata.create_all(engine)  # 生成對應的表      

4、操作模型

在上述模型表的基礎上對表模型進行CURD操作,通過建構一個類進行完成:

from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker  # 添加資料相關


engine = create_engine("mysql://root:@127.0.0.1:3306/user_orm?charset=utf8") #連接配接資料庫

Session = sessionmaker(bind=engine) #通過session操作模型表,類似mysql中的cursor

class MysqlOrmDb:
    """對模型表的CURD操作"""
    def __init__(self):
        self.session = Session()

    def add_one(self):
        """
        新增一條記錄
        :return:
        """
        new_obj = User(
            username="王鵬",
            password="21546",
            email="[email protected]",
            name="王鵬",
            phone="12873654",
            gender=2,
            department_id=3,
        )
        self.session.add(new_obj)
        self.session.commit()
        return new_obj

    def add_all(self):
        user_obj_list = [
            User(
                username="王漢",
                password="21546",
                email="[email protected]",
                name="王漢",
                phone="12873654",
                gender=2,
                department_id=3,
            ),
            User(
                username="李哈",
                password="21546",
                email="[email protected]",
                name="李哈",
                phone="12873654",
                gender=2,
                department_id=3,
            )
        ]
        self.session.add_all(user_obj_list)
        self.session.commit()
        return user_obj_list

    def get_one(self):
        """
        查詢一條資料
        :return:
        """
        return self.session.query(User).get(3)  # get的參數為id

    def get_more(self):
        """
        擷取多條資料
        :return:
        """
        return self.session.query(User).filter_by(gender=2)

    def update_one_data(self, pk):
        """
        修改一條資料
        :param pk:
        :return:
        """
        new_obj = self.session.query(User).get(pk)
        if new_obj:
            new_obj.gender = 1
            self.session.add(new_obj)
            self.session.commit()
            return True
        return False

    def update_more_data(self):
        """
        修改多條資料
        :return:
        """
        data_list = self.session.query(User).filter_by(gender=1)
        if data_list:
            for item in data_list:
                item.gender = 2
                self.session.add(item)
            self.session.commit()
            return True
        return False

    def delete_one_data(self, pk):
        """
        删除一條資料
        :param pk:
        :return:
        """
        user_obj = self.session.query(User).get(pk)
        if user_obj:
            self.session.delete(user_obj)
            self.session.commit()
            return True
        return False

    def delete_more_data(self):
        """
        删除多條資料
        :return:
        """
        data_list = self.session.query(User).filter(User.id > 1)
        if data_list:
            for item in data_list:
                self.session.delete(item)
            self.session.commit()
            return True
        return False      

4、完整執行個體

python操作mysql資料庫
python操作mysql資料庫
from sqlalchemy import Column, Integer, String
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker  # 添加資料相關


engine = create_engine("mysql://root:@127.0.0.1:3306/user_orm?charset=utf8") #連接配接資料庫

Base = declarative_base()


class User(Base): #Base是基類
    """
    建立資料庫表
    """
    __tablename__ = 'crm_userinfo' #表示建立的表名

    id = Column(Integer, primary_key=True)
    username = Column(String(32))
    password = Column(String(64))
    email = Column(String(32))
    name = Column(String(32))
    phone = Column(String(32))
    gender = Column(Integer)
    department_id = Column(Integer)


Session = sessionmaker(bind=engine) #通過session操作模型表,類似mysql中的cursor


class MysqlOrmDb:
    """對模型表的CURD操作"""
    def __init__(self):
        self.session = Session()

    def add_one(self):
        """
        新增一條記錄
        :return:
        """
        new_obj = User(
            username="王鵬",
            password="21546",
            email="[email protected]",
            name="王鵬",
            phone="12873654",
            gender=2,
            department_id=3,
        )
        self.session.add(new_obj)
        self.session.commit()
        return new_obj

    def add_all(self):
        user_obj_list = [
            User(
                username="王漢",
                password="21546",
                email="[email protected]",
                name="王漢",
                phone="12873654",
                gender=2,
                department_id=3,
            ),
            User(
                username="李哈",
                password="21546",
                email="[email protected]",
                name="李哈",
                phone="12873654",
                gender=2,
                department_id=3,
            )
        ]
        self.session.add_all(user_obj_list)
        self.session.commit()
        return user_obj_list

    def get_one(self):
        """
        查詢一條資料
        :return:
        """
        return self.session.query(User).get(3)  # get的參數為id

    def get_more(self):
        """
        擷取多條資料
        :return:
        """
        return self.session.query(User).filter_by(gender=2)

    def update_one_data(self, pk):
        """
        修改一條資料
        :param pk:
        :return:
        """
        new_obj = self.session.query(User).get(pk)
        if new_obj:
            new_obj.gender = 1
            self.session.add(new_obj)
            self.session.commit()
            return True
        return False

    def update_more_data(self):
        """
        修改多條資料
        :return:
        """
        data_list = self.session.query(User).filter_by(gender=1)
        if data_list:
            for item in data_list:
                item.gender = 2
                self.session.add(item)
            self.session.commit()
            return True
        return False

    def delete_one_data(self, pk):
        """
        删除一條資料
        :param pk:
        :return:
        """
        user_obj = self.session.query(User).get(pk)
        if user_obj:
            self.session.delete(user_obj)
            self.session.commit()
            return True
        return False

    def delete_more_data(self):
        """
        删除多條資料
        :return:
        """
        data_list = self.session.query(User).filter(User.id > 1)
        if data_list:
            for item in data_list:
                self.session.delete(item)
            self.session.commit()
            return True
        return False


def main():
    # Base.metadata.create_all(engine)  # 生成對應的表
    # 添加一條資料
    # obj = MysqlOrmDb()
    # result = obj.add_one()
    # print(result.id)
    # 添加多條資料
    # obj = MysqlOrmDb()
    # result=obj.add_all()
    # print(result) #[<__main__.User object at 0x0000000003AE4208>, <__main__.User object at 0x0000000003AE4278>]
    # 查詢一條資料
    # obj = MysqlOrmDb()
    # result=obj.get_one()
    # if result:
    #     print(result.id,result.username)
    # else:
    #     print("not exist")
    # 查詢多條資料
    # obj=MysqlOrmDb()
    # result=obj.get_more()
    # print(result.count())
    # for user_obj in result:
    #     print(user_obj.id,user_obj.username,'\n')
    obj=MysqlOrmDb()

if __name__ == '__main__':
    main()      

執行個體

更多請檢視:https://docs.sqlalchemy.org/en/13/intro.html

作者:iveBoy

出處:http://www.cnblogs.com/shenjianping/

本文版權歸作者和部落格園共有,歡迎轉載,但未經作者同意必須在文章頁面給出原文連接配接,否則保留追究法律責任的權利。