SQLAlchemy

在使用 django 操做數據庫時。會使用django提供的ORM,在使用其餘框架時。沒有自帶的ORM,這個時候就出現了一個替代品 -- SQLAlchemymysql

SQLAlchemy是 Python 編程語言下的一款開源軟件。提供了SQL工具包及對象關係映射(ORM)工具sql

SQLAlchemy「採用簡單的Python語言,爲高效和高性能的數據庫訪問設計,實現了完整的企業級持久模型」。SQLAlchemy的理念是,SQL數據庫的量級和性能重要於對象集合;而對象集合的抽象又重要於表和行。所以,SQLAlchemy採用了相似於JavaHibernate的數據映射模型,而不是其餘ORM框架採用的Active Record模型。不過,Elixir和declarative等可選插件能夠讓用戶使用聲明語法。數據庫

SQLAlchemy 的一個目標是提供能兼容衆多數據庫(如 SQLite、MySQL、Postgres、Oracle、MS-SQL、SQLServer 和 Firebird)的企業級持久性模型django

單表操做

建立表

# 導入模塊
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.engine import create_engine

from sqlalchemy import Column
from sqlalchemy import String
from sqlalchemy import Integer

# 實例化,創建基礎類 -- 關係映射類
model = declarative_base()

# 建立引擎。用於指定庫
engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/test?charset=utf8')


class Users(model):
    '''
    Users : 類名,對象
    user : 真實的表名
    Column : 列  數據庫中的字段所在位置
    Integer :當前字段的數據類型,看寫參數控制長度
    String  :當前字段的數據類型,可寫參數控制長度
    '''
    __tablename__ = 'user'
    id = Column(Integer,primary_key=True,autoincrement=True)
    name = Column(String(32),nullable=False)

# 檢索全部繼承model的對象,並在engine指向的庫中建立表
model.metadata.create_all(engine)

須要注意的時。在建立表的時候。須要把字段寫入。不寫字段會報錯
View Code

增長數據

from sqlalchemy.orm import sessionmaker
from create_table import engine,Users

# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()

info = Users(name='略略略') # 新建SQL語句 -- insert into
db_session.add(info) # 將SQL添加到查詢窗口
db_session.commit() # 執行窗口內SQL語句
db_session.close() # 關閉窗口
增長一條數據
from sqlalchemy.orm import sessionmaker
from create_table import engine,Users
# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()

info_list = [Users(name='大G'),Users(name='小G')]
db_session.add_all(info_list) # 將SQL添加到查詢窗口
db_session.commit() # 執行窗口內SQL語句
db_session.close()
增長多條數據

 查詢數據

from sqlalchemy.orm import sessionmaker
from create_table import engine,Users
# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()

# 查詢出全部數據
res = db_session.query(Users).all()
print(res)
for i in res:
    print(i.name)
'''
[
 <__main__.Users object at 0x000002955002C4E0>,
 <__main__.Users object at 0x000002955002C128>, 
 <__main__.Users object at 0x000002955002C2B0>
 ]
 略略略
 大G
 小G
'''
# 查詢出全部數據中的第一條
ret = db_session.query(Users).first()
print(ret)
print(ret.name)
'''
<__main__.Users object at 0x000002955002C4E0>
略略略
'''

# 簡單的待條件查詢
res = db_session.query(Users).filter(Users.id < 2).all()
print(res)
print(res[0].name)
'''
[<__main__.Users object at 0x0000022A71C2B320>]
略略略
'''

# 並列條件查詢
res = db_session.query(Users).filter(Users.id<4,Users.name=="略略略").all()
print(res)
print(res[0].id)
'''
[<__main__.Users object at 0x000001E378B2B4E0>]
1
'''
View Code

更新數據

from sqlalchemy.orm import sessionmaker
from create_table import engine,Users
# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()

db_session.query(Users).filter(Users.id==1).update({'name':'哈哈哈'})
db_session.commit()
View Code

刪除數據

from sqlalchemy.orm import sessionmaker
from create_table import engine,Users
# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()

db_session.query(Users).filter(Users.id==1).delete()
db_session.commit()
View Code

 

多表操做

一對多

建立表

# 導入模塊
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.engine import create_engine
from sqlalchemy.orm import relationship #用於創建關係 # relationship ORM精髓所在
from sqlalchemy import Column
from sqlalchemy import String
from sqlalchemy import Integer
from sqlalchemy import ForeignKey

# 實例化,創建基礎類 -- 關係映射類
model = declarative_base()

# 建立引擎。用於指定庫
engine = create_engine('mysql+pymysql://root:123@127.0.0.1:3306/test?charset=utf8')

class Student(model):
    __tablename__ = "student"
    id = Column(Integer, primary_key=True)
    name = Column(String(32), nullable=False)
    sch_id = Column(Integer, ForeignKey("school.id"))  # 多對一關係存儲列
    stu2sch = relationship("School", backref="sch2stu")


class School(model):
    __tablename__ = "school"
    id = Column(Integer, primary_key=True)
    name = Column(String(32), nullable=False)

model.metadata.create_all(engine)
View Code

增長數據

建議前後給外鍵所在表添加數據

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine

session = sessionmaker(engine)
db_session = session()

sc = School(name='哈佛大學')
db_session.add(sc)
db_session.commit()
db_session.colse()


# 在給外鍵所在的表添加數據

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine

session = sessionmaker(engine)
db_session = session()
school_id = db_session.query(School).filter(School.name=='哈佛大學').first()
print(school_id)
stu = Student(name='大熊',sch_id=school_id.id)
db_session.add(stu)
db_session.commit()
正常添加數據
from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine
from create_table_ForeignKey import Student,School

session = sessionmaker(engine)
db_session = session()

stu = Student(name='靜香',stu2sch=School(name='劍橋大學')) 
db_session.add(stu)
db_session.commit()
正向添加數據
from sqlalchemy.orm import sessionmaker
from s1.create_table_ForeignKey import engine
from s1.create_table_ForeignKey import Student,School

session = sessionmaker(engine)
db_session = session()

sch = School(name='牛津大學')
sch.sch2stu = [
    Student(name='胖虎'),
    Student(name='櫻桃小丸子')
]
db_session.add(sch)
db_session.commit()
反向添加數據

查詢數據

from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine
from create_table_ForeignKey import Student,School

session = sessionmaker(engine)
db_session = session()

res = db_session.query(Student).all()
for sch in res:
    print(sch.stu2sch.name)
正向查詢
from sqlalchemy.orm import sessionmaker
from create_table_ForeignKey import engine
from create_table_ForeignKey import Student,School

session = sessionmaker(engine)
db_session = session()

res = db_session.query(School).all()
for sch in res:
    for s in sch.sch2stu:
        print(s.name)
反向查詢數據

更新數據

from sqlalchemy.orm import sessionmaker
from create_table import engine,Users
# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()


sch = db_session.query(School).filter(School.name=='哈佛大學').first()
stu = db_session.query(Student).filter(Student.id==sch.id).update({'name':'胖小虎'})
db_session.commit()
View Code

 刪除數據

from sqlalchemy.orm import sessionmaker
from create_table import engine,Users
# 新建查詢窗口
session = sessionmaker(engine)

# 打開查詢窗口
db_session = session()

sch = db_session.query(School).filter(School.name=='哈佛大學').first()
stu = db_session.query(Student).filter(Student.id==sch.id).delete()
db_session.commit()
View Code

多對多操做

建立表

在多對多中。SQLAlchemy不會爲咱們自動建立出第三張表,須要手動建立編程

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.engine import create_engine

Model = declarative_base()
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/test?charset=utf8")

class Girls(Model):
    __tablename__ = "girl"
    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=False)

    g2b = relationship("Boys",backref="b2g",secondary="hotel")

class Boys(Model):
    __tablename__ = "boy"
    id = Column(Integer,primary_key=True)
    name = Column(String(32),nullable=False)


class Hotels(Model):
    __tablename__ = "hotel"
    id = Column(Integer,primary_key=True)
    boy_id = Column(Integer,ForeignKey("boy.id"))
    girl_id = Column(Integer,ForeignKey("girl.id"))


Model.metadata.create_all(engine)
View Code

增長數據

from sqlalchemy.orm import sessionmaker
from create_table_M2M import engine
from create_table_M2M import Girls,Boys

s = sessionmaker(engine)
db_session = s()

g = Girls(name='瑪麗蓮',g2b=[Boys(name='美國隊長'),Boys(name='閃電俠')])
db_session.add(g)
db_session.commit()
正向添加數據
from sqlalchemy.orm import sessionmaker
from create_table_M2M import engine
from create_table_M2M import Girls,Boys

s = sessionmaker(engine)
db_session = s()


b = Boys(name='鋼鐵俠')
b.b2g = [
    Girls(name='蜘蛛精'),
    Girls(name='白骨精')
]
db_session.add(b)
db_session.commit()
反向添加數據

查詢數據

from sqlalchemy.orm import sessionmaker
from create_table_M2M import engine
from create_table_M2M import Girls,Boys

session = sessionmaker(engine)
db_session = session()

g_list = db_session.query(Girls).all()
for g in g_list:
    for boy in g.g2b:
        print(boy.name)
正向查詢數據
from sqlalchemy.orm import sessionmaker
from create_table_M2M import engine
from create_table_M2M import Girls,Boys

session = sessionmaker(engine)
db_session = session()

b_list = db_session.query(Boys).all()
for b in b_list:
    for girl in b.b2g:
        print(girl.name)
反向查詢數據
相關文章
相關標籤/搜索