1. 程式人生 > >python ORM - sqlalchemy 操作使用

python ORM - sqlalchemy 操作使用

== from python filter OS char 一個 efault 連接數

python操作數據庫

使用 ORM - sqlalchemy,pymsql

安裝:

pip install pymsq
pip install sqlalchemy

一、 ‘‘‘連接數據庫‘‘‘

 ‘‘‘導入必須的包‘‘‘
from
sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy.orm import sessionmaker
# 基本設置 
HOSTNAME = 127.0.0.1   # 本地 liunx
POST = 
3306 # mysql 默認端口 DATABASE = mydb # 數據庫名字 USERNAME = admin # 用戶名 PASSWORD = Root110qwe # 密碼
# 固定寫法
db_url = mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8.format( USERNAME, PASSWORD, HOSTNAME, POST, DATABASE )
# 這裏的 db_url 就是連接數據庫的路徑。“mysql+mysqldb”指定了使用 MySQL-Python 來連
engine = create_engine(db_url,echo=False)   # 初始化數據庫連接, 
# create_engine() 會返回一個數據庫引擎,echo 參數為 True 時,會顯示每條執行的 SQL 語句,生產環境下可關閉。
Base = declarative_base(engine) # 創建對象的基類
Session = sessionmaker(engine) # 創建與數據庫連接的Session類
session = Session() # session可以視為數據庫連接
# sessionmaker() 會生成一個數據庫會話類。這個類的實例可以當成一個數據庫連接,它同時還記錄了一些查詢的數據,並決定什麽時候執行 SQL 語句。
if __name__ == __main__:  # 測試是否連接成功
    connection = engine.connect()
    result = connection.execute(select 1)
    print(result.fetchone())



二 、 ‘‘‘創建 類—表 映射關系‘‘‘

    創建表的同時,也映射數據庫;也可以單獨創建表,

# -*- coding:utf-8 -*-

from datetime import datetime
from sqlalchemy import Column,Integer,String,DateTime 
from connect import Base,session # 這裏connect前面加上點之後 不能直接執行文件,但是可以外部調用


‘‘‘創建表 user ‘‘‘
class User(Base):

    __tablename__ = user
    id = Column(Integer,primary_key=True,autoincrement=True) #主鍵 ,自增長
    username = Column(String(20),nullable=False) # 用戶名長度 20 、非空
    password = Column(String(50)) # 密碼長度 50
    creatime = Column(DateTime,default=datetime.now) # 創建時間

    @classmethod
    def by_name(cls,name): # 定義查詢函數,返回查詢結果
        return session.query(cls).filter(cls.username==name).first()

    def __repr__(self): # 重寫repr 便於閱讀
        return "<User(id=%s,username%s,password=%s,createtime=%s)>" % (
            self.id,
            self.username,
            self.password,
            self.creatime
        )

from sqlalchemy.orm import relationship
from sqlalchemy import ForeignKey


‘‘‘創建表 user_details ‘‘‘
class UserDetails(Base):

    __tablename__=user_details
    id = Column(Integer, primary_key=True, autoincrement=True)
    id_card = Column(Integer,nullable=True,unique=True)
    lost_login = Column(DateTime)
    login_num = Column(Integer,default=0)
    user_id = Column(Integer,ForeignKey(user.id))

    ‘‘‘
    User 要關聯的表的名字
    backref 返回 details 方法(屬性)
    uselist 默認為True, 表示一對多關系(False表示一對一)
    cascade 自動處理關系 相當於mysql中的ON DELETE 類似 有 7 個可選參數
    在代碼層控制
    ‘‘‘
    userdetail = relationship(User,backref=details,uselist=False,cascade=all)

    def __repr__(self):  # 重寫repr 便於閱讀
        return <UserDetails(id=%s,id_card=%s,last_login=%s,login_num=%s,user_id=%s)>%(
            self.id,
            self.id_card,
            self.lost_login,
            self.login_num,
            self.user_id
        )


from sqlalchemy import  Table

‘‘‘ 創建表的另一種方法 這種方法沒有映射,如果需要映射 還需重新創建 類,重寫 repr‘‘‘
user_article = Table(user_article,Base.metadata,
     Column(user_id,Integer,ForeignKey(user.id),primary_key=True),
     Column(article_id,Integer,ForeignKey(article.id),primary_key=True)
 )


‘‘‘創建表 article ‘‘‘
class Article(Base):

    __tablename__ = article
    id = Column(Integer,primary_key=True,autoincrement=True)
    content = Column(String(50),nullable=True)
    create_time = Column(DateTime,default=datetime.now())

    article_user = relationship(User,backref=article,secondary=user_article)# 創建映射關系

    def __repr__(self):  # 重寫repr 便於閱讀
        return  Article(id=%s,content=%s,create_time=%s)%(
            self.id,
            self.content,
            self.create_time
        )


if __name__ == __main__:
    Base.metadata.create_all() # 執行

三 、 ‘‘‘簡單的 增、刪、查、改 操作 ‘‘‘

# -*- coding:utf-8 -*-
from connect import session
from user_module import User

def add_user(): #
    # persson = User(username=‘xiaohong‘,password=‘qwe123‘,id=1)
    # session.add(persson)  # 提交單條數據

    # 一次提交多條數據 , 註意 這裏 all 裏面是列表
    session.add_all(
        [
        User(username=小紅, password=qwe123mmm),
        User(username=老王, password=12345nnnnn),
        User(username=小明, password=654321hhhhh),
        ]
    )
    session.commit() # 必須提交

def search_user(): # 查詢 默認repr 便於機器閱讀,需要重寫
    rows = session.query(User).all()
    print(rows)

def update_user(): #
    session.query(User).filter(User.id==2).update({User.password:1})
    session.commit()

def delete_user(): # 刪除
    # rows = session.query(User).filter(User.id==2)[0]
    rows = session.query(User).all()
    print(rows)
    for i in rows: # 如果查到的數據量大,就是用循環刪除 
        session.delete(i)
    session.commit()


if __name__ == __main__:
    add_user()
    # search_user()
    # delete_user()
    # update_user()

推薦文章:廖雪峰的 使用SQLAlchemy

     腳本之家的 Python SQLAlchemy基本操作和常用技巧(包含大量實例,非常好)

     z+j 的 Python SqlAlchemy使用方法

     K.TakanashiSQLAlchemy的初步使用 

     SQLAlchemy入門(一)

python ORM - sqlalchemy 操作使用