orm-sqlalchemy

1.ORMpython

在服務器後臺,數據是要存儲在數據庫的,可是若是項目在開發和部署的時候,是使用的不一樣的數據庫,該怎麼辦呢?是否是須要把全部的 SQL 語句都再從新寫一遍呢?mysql

        

ORMsql

ORM全稱 Object Relational Mapping對象關係映射數據庫

經過 ORM 能夠不用關心後臺是使用的哪一種數據庫,只須要按照 ORM 所提供的語法規則去書寫相應的代碼, ORM 就會自動的轉換成對應對應數據庫的 SQL 語句服務器

2. SQLAlchemy鏈接數據庫session

第一步:安裝app

安裝: mysql測試

安裝python包: pymysql、sqlalchemyfetch

pip安裝 python 包url

pip install -i https://pypi.douban.com/simple pymysql

pip install -i https://pypi.douban.com/simple sqlalchemy 這裏是使用國內的源

建立/data目錄,在下面建立connect.py文件

from sqlalchemy import create_engine  #第二步:導入模塊

#第三步:數據庫數據 USERNAME
= 'admin' PASSWORD = 'Root110qwe' HOST = '127.0.0.1' PORT = 3306 DATABASE = 'mydb' Db_url = 'mysql+pymysql://{}:{}@{}:{}/{}?charset=utf8'.format( #第四步:數據鏈接 URL
    USERNAME,
    PASSWORD,
    HOST,
    PORT,
    DATABASE
)
engine = create_engine(Db_url) #第五步:鏈接數據庫

if __name__ == '__main__':    #第六步:測試鏈接
    connection = engine.connect() #定義遊標
    result = connection.execute('select 1')
    print(result.fetchone())

3.建立Module

第一步:建立 Module 的 Base 類

在connect.py文件中生成Base類

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base(engine) #數據庫建模使用繼承來創建

對象關係型映射,數據庫中的表與python中的類相對應,建立的類必須繼承自 sqlalchemy 中的基類。

使用 declarative 方法定義的映射類依據一個基類,這個基類是維繫類和數據表關係的目錄。

應用一般只須要有一個 Base 的實例。咱們經過 declarative_base() 功能建立一個基類。

第二步:建立 Module

新增user_modules.py文件

#這個文件是用來創建模型
from connect import Base
from sqlalchemy import Column,Integer,String,DateTime,Boolean
from datetime import datetime

class User(Base):
    '''
    創建一個User模型,創建一張user表
    '''
    __tablename__ = 'user'
    id = Column(Integer,autoincrement=True,primary_key=True)
    username = Column(String(20))
    password = Column(String(20))
    create_time = Column(DateTime,default=datetime.now())
    _locked = Column(Boolean,default=False,nullable=False) #當前用戶是否已經登陸,是否還能登陸

#第三步:建立 Module

if __name__ == '__main__':
    Base.metadata.create_all() #建立表格

再次強調,咱們用類來表示數據庫裏面的表!!!

這些表的類都繼承於咱們的Base基類。

在類裏面咱們定義一些屬性,這個屬性經過映射,就對應表裏面的字段

Module

__tablename__: 數據庫中的表名

Column: 用來建立表中的字段的一個方法

Integer: 整形,映射到數據庫中的int類型

String: 字符類型,映射到數據庫中的varchar類型,使用時,須要提供一個字符長度

DateTime: 時間類型

4. 數據的增刪改查

第一步:建立會話

在connect.py中添加

from  sqlalchemy.orm import sessionmaker

Session = sessionmaker(engine)  #生成一個會話類,用來操做數據
session = Session()

在對錶數據進行增刪改查以前,先須要創建會話,創建會話以後才能進行操做,就相似於文件要打開以後才能對文件內容操做

add

add 是添加一條數據, add_all 添加多條數據

query

query 就是查詢的意思,在 SQLAlchemy 中也用來查詢數據

all 是查詢全部的意思

first 是查詢第一條數據

在後面會詳細介紹更過的用法

update

update更新是須要使用字典傳值

delete

使用 delete 方法來刪除數據

建立test_user_module.py文件。

from connect import session
from user_modules import User

def add_user():
    '''添加數據'''
    person = User(username='shiwei',password='1234')
    session.add_all([  #接收一個列表,添加多條,每一條是列表裏面的一個元素
        User(username='塔卡',password='12341'),
        User(username='小潑',password='55432'),
        User(username='清空',password='12341'),
    ])
    # session.add(person)  #會默認開啓一個事物,添加一條
    session.commit()  #提交事務

def search_user():
    '''查看數據'''
    rows = session.query(User).all()  #查詢全部
    # rows = session.query(User).first()  #查詢第一條
    print(rows)

def update_user():
    '''更新數據'''
    #更新是須要使用字典傳值
    session.query(User).filter(User.username == '塔卡').update({User.password:'23115'})
    session.commit()

def delete_user():
    '''刪除數據'''
    rows = session.query(User).filter(User.username == '式微')[0]  #須要使用索引取原生SQL值,否則會是
    print(rows)
    session.delete(rows)
    session.commit()

if __name__ == '__main__':
    delete_user()

 

執行查詢search_user()時,會顯示以下內容。須要對module模塊進行重寫__repr__

[<user_modules.User object at 0xb679104c>, <user_modules.User object at 0xb679190c>, <user_modules.User object at 0xb679194c>, <user_modules.User object at 0xb679198c>, <user_modules.User object at 0xb67919cc>]

class User(Base):
    '''
    創建一個User模型,創建一張user表
    '''
    __tablename__ = 'user'
    id = Column(Integer,autoincrement=True,primary_key=True)
    username = Column(String(20))
    password = Column(String(20))
    create_time = Column(DateTime,default=datetime.now())
    _locked = Column(Boolean,default=False,nullable=False) #當前用戶是否已經登陸,是否還能登陸

    def __repr__(self):
        return '''
        <User(id=%s,username=%s,create_time=%s,_locked=%s)>
        '''%(self.id,self.username,self.password,self._locked)

從新運行search_user.py文件,展現結果以下,解析成容易讀取的信息:

相關文章
相關標籤/搜索
本站公眾號
   歡迎關注本站公眾號,獲取更多信息