Python和MySQL數(shù)據(jù)庫

數(shù)據(jù)庫分類

  1. SQL(關(guān)系型數(shù)據(jù)庫)
    • MySQL
    • Oracle
    • SQL Server
    • DB2
  2. NoSQL
    這個NoSQL表示是Not Only SQL,而不是No SQL。SQL的本質(zhì)是保證事物的完整性(高并發(fā)的情況下)遵循ACID?,無法水平擴展。因而NoSQL基于CAP,在犧牲事物(有可能丟失)的情況下實行水平擴展,
    • MongoDB
    • Neo4j
    • HBase

MySQL的簡單操作

  1. 使用Navicat來創(chuàng)建表
  2. 使用python來操作SQL
    • 首先使用開發(fā)包,主要有三種mysql-connectorMySQLdb、SQLAlchemy。其中相比mysql-connector,MySQLdb用的比較多。而第一個則是官方給出的方案。
    • 安裝方案如下:
      pip3 install mysql-connector    #安裝mysql-connector
      pip3 install PyMySQL            #安裝MySQLdb 3.x以上的替代方案
      

mysql-connector實操

  1. 創(chuàng)建鏈接
    from mysql import connector
    conn = connector.connect(host = 'localhost', port = 3306 ,
                            user = 'root', password = 'laoduan2008',
                            charset = 'utf8')
    conn.autocommit = True #為了不重復輸入commit
    
    ERROR Record:
    • mysql.connector.errors.NotSupportedError: Authentication plugin 'caching_sha2_password' is not supported
      MySQL8在這里和低版本不兼容,你可以重新安裝MySQL(或者用Reconfigure選項),把認證的選項設(shè)置為“Use Legacy Authentication Method”, 或者你如果不是必須要用MySQL 8,可以降級到低版本。
  2. 創(chuàng)建游標
    cursor = conn.cursor()
    sqltext = 'insert into users(name, address, email) values ("deamov","beijing","abc@blabla")'
    #設(shè)置語句
    
    text_temple = 'insert into users(name, address, email) values (%s ,%s ,%s)'
    cursor.executemany(sql_template,userinfo)
    #如何執(zhí)行多條語句
    
  3. 執(zhí)行SQL
    cursor.execute(sqltext)
    #執(zhí)行語句
    
  4. 關(guān)閉連接
    cursor.close()
    conn.close()
    

PyMySQL

  1. 創(chuàng)建鏈接
    import pymysql
    conn = pymysql.connect()
    
    conn.autocommit(True)
    
    
    ERROR Record
    • pymysql.err.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")
      有可能是root賬號的密碼這些不能登陸,通過root賬號登陸后,分配一個賬號類似CREATE USER 'deamov'@'localhost IDENTIFIED WITH mysql_native_password BY 'password';。之后,use your_database_name選擇了你要用的數(shù)據(jù)庫后,將權(quán)限給你的新的賬戶grant all privileges on *.* to deamov@localhost。
  2. 創(chuàng)建游標
    cursor = conn.cursor()
    #mysql-connector用的是弱引用
    #PyMySQL的游標可以在函數(shù)里用
    
  3. 執(zhí)行SQL
    sqltext = 'select * from users'
    
    cursor.excute(sqltext)
    for row in cursor:
        print row
    #讀取所有的
    for row in cursor.fetchmany(2):
        print row
    #讀取兩條
    from faker import Factory
    userfaker = Factory.create()
    userinfo = [(userfaker.name(),userfaker.address(),userfaker.email()) for i in range(10)]
    
    text_temple = 'insert into users(name, address, email) values (%s ,%s ,%s)
    cursor.executemany(sql_template,userinfo)
    #批量插入
    
  4. 關(guān)閉鏈接
    cursor.close()
    conn.close()
    

SQLAlchemy

The Python SQL Toolkit and Object Relational Mapper。
ORM(O是面向?qū)ο?,R是面向關(guān)系,M是Map):
面向?qū)ο蠛兔嫦蜿P(guān)系的模擬關(guān)聯(lián)。

  • 表映射到類
    • 行映射到對象
    • 列映射到屬性

優(yōu)點如下

  1. 隱藏數(shù)據(jù)庫實現(xiàn)
  2. 良好的數(shù)據(jù)庫操作接口,簡單,學習成本低。
  3. 動態(tài)數(shù)據(jù)表映射

開發(fā)步驟

  1. 創(chuàng)建鏈接
    from sqlalchemy import create_engine
    from sqlalchemy.ext.declarative import declarative_base
    from sqlalchemy import Column,Integer,String,DateTime,ForeignKey
    
    engine = create_engine('mysql+mysqldb://deamov:password@127.0.0.1:3306/MySQLTest?charset=utf8',echo=True)
    #echo這個參數(shù)是把sql的語句打印出來
    
  2. 創(chuàng)建映射(表的設(shè)計)
    Base = declarative_base()
    class User(Base):
        __tablename__ = 'users'
        
        id = Column(Integer, primary_key = Ture)
        name = Column(String(40))
        orders = relationship('Order')
    
    class Product(Base):
        __tablename__ = 'products'
            
        id = Column(Integer, primary_key = Ture)
        name = Column(String(40))
        orders = relationship('Order')
        #這個orders不是ddl語言,而是針對面向?qū)ο缶幊潭缘?
    class Order(Base):
        __tablename__ = 'orders'
    
        id = Column(Integer,primary_key = True)
        otime = Column(DateTime)
        uid = Column(Integer, ForeignKey('users.id'))
        pid = Column(Integer, ForeignKey('products.id'))
        #定義外鍵
    
  3. 初始化映射實例
    Base.metadata.create_all(engine)
    
  4. 創(chuàng)建會話
    Session = sessionmaker(engine)
    session = Session()
    
  5. 持久化對象實例
    DeamoV = User(name = 'DeamoV')
    session.add(DeamoV)
    p1 = Product(name = 'p1')
    session.add(p1)
    session.commit()
    
    '''
    ------
    '''
    #DeamoV = session.query(User).filter(User.name=='DeamoV')
    #返回的是一個集合,集合里是選擇的實例類
    #p1 = session.query(Product).filter(Product.name=='p1')
    #這里的Product和User都是類的名字
    o1 = Order(uid=p1.id ,pid=p1.id)
    #添加了一個關(guān)系
    session.add(o1)
    orders=DeamoV.orders
    #這個時候獲取這個關(guān)系,目前只有一個關(guān)系
    for order in orders:
        print(order.id) 
    
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 轉(zhuǎn)載,覺得這篇寫 SQLAlchemy Core,寫得非常不錯。不過后續(xù)他沒寫SQLAlchemy ORM... ...
    非夢nj閱讀 5,591評論 1 14
  • 杜炯冒死闖地宮1 中午的時候,遠在大山深處的這個十幾人的隊伍,顯得尤為警惕。走在茂密的原始森林里,既有驚奇,也有莫...
    東籬花飛閱讀 420評論 2 12
  • 嗨咯!大家好,我是“小團長”來到簡書的原因很簡單,用自己微薄的文字去記錄的自己生活的之前之后。不喜勿噴(?>ω<*?)。
    小團長閱讀 134評論 0 0
  • 我想, 我不會再那樣去熱烈地愛一個人, 那些反復被歲月消融掉的枕上的淚痕, 已逐漸消磨我的激情。 我想, 去尋找屬...
    ALUSAN閱讀 376評論 0 0
  • “楚辭”激蕩卷千浪 “離騷”響徹震萬重 汨羅江的水在嗚咽 伴著對屈原的思念 三千年揮之不去 長嘯 悵然佇立 楚江的...
    詩韻鐘鳴閱讀 229評論 1 4

友情鏈接更多精彩內(nèi)容