一篇搞定SQLAlchemy--關系對象映射


  要使用SQLAlchemy,必須先下載這個模塊

  • pip3 install sqlalchemy 或 pycharm File--> Settings-->project...-->Project Interpreter-->右上+-->搜索你要安裝的模塊
  • 源碼安裝,源碼下載地址:https://www.oschina.net/news/84998/sqlalchemy-1-1-10

  開始操作前,你必須清楚SQLAlchemy實現操作數據庫的原理,SQLAlchemy本身是無法操作數據庫的,必須通過第三庫pymysql,而SQAlchemy內的Dialect就是用來和數據API進行交流的,實現過程就是利用python最為常用的類和對象來,一張表就是一個類,一行數據就是一個對象

  了解到這,就是開始我們的實戰吧!利用ORM(關系對象映射)創建表,分5步走

  第一步:導模塊

#導模塊
#用於和數據庫創建連接
from sqlalchemy import create_engine
#用於實例一個基類,創建表時必須繼續這個父類
from  sqlalchemy.ext.declarative import declarative_base
#導入表元素,列,數據類型,外鍵,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

   第二步:創建數據庫連接

  數據傳入格式mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]

#連接數據庫,在這里傳入你要使用的數據庫類型和第三方操作數據庫的模塊
engine = create_engine("mysql+pymysql://root:123@127.0.0.1:3306/db1",echo=True,max_overflow=5)

   第三步:創建基類

  創建表類時 ,必須繼承這個類

#創建基類
Base = declarative_base()

   第四步:創建表,記得要繼承基類

#創建表類
class Users(Base):
    __tablename__ = 'users'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
        UniqueConstraint('nid','name',name='uix_nid_name'),
        Index('ix_name_extra','name','extra'),
    )

   第五步:

#由於上面只是在代碼級別實現,還沒真正的創建表,所有還需一個執行動作
Base.metadata.create_all(engine)

 全部代碼:

# usr/bin/env python
# -*- encoding:utf-8 -*-

#導模塊
#用於和數據庫創建連接
from sqlalchemy import create_engine
#用於實例一個基類,創建表時必須繼續這個父類
from  sqlalchemy.ext.declarative import declarative_base
#導入表元素,列,數據類型,外鍵,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

#連接數據庫,在這里傳入你要使用的數據庫類型和第三方操作數據庫的模塊
engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5)

#創建基類
Base = declarative_base()

#創建表類
class Users(Base):
    __tablename__ = 'users'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
        UniqueConstraint('nid','name',name='uix_nid_name'),
        Index('ix_name_extra','name','extra'),
    )


#由於上面只是在代碼級別實現,還沒真正的創建表,所有還需一個執行動作
Base.metadata.create_all(engine)
View Code

 

  一對多創建表,重點就是外鍵

#一對多
#外鍵關聯的表要先創建
class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer,primary_key=True)
    caption = Column(String(50),default='red',unique=True)

class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32),index=True,nullable=True)
    favor_id = Column(Integer,ForeignKey('favor.nid'))

   多對多創建表

#多對多,需要創建三張表
class Group(Base):
    __tablename__ = 'group'
    nid = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    port = Column(Integer,default=22)

class Server(Base):
    __tablename__ = 'server'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    hostname = Column(String(64),unique=True,nullable=False)

class ServerToGroup(Base):
    __tablename__ = 'servertogroup'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    sever_id = Column(Integer,ForeignKey('server.nid'))
    group_id = Column(Integer,ForeignKey('group.nid'))

 

   刪除所有的表

    Base.metadata.drop_all(engine)

 完整代碼

# usr/bin/env python
# -*- encoding:utf-8 -*-

#導模塊
#用於和數據庫創建連接
from sqlalchemy import create_engine
#用於實例一個基類,創建表時必須繼續這個父類
from  sqlalchemy.ext.declarative import declarative_base
#導入表元素,列,數據類型,外鍵,索引..
from sqlalchemy import Column,Integer,String,ForeignKey,UniqueConstraint,Index

#連接數據庫,在這里傳入你要使用的數據庫類型和第三方操作數據庫的模塊
engine = create_engine("mysql+pymysql://root:lpfendou2015,,@127.0.0.1:3306/db1",echo=True,max_overflow=5)

#創建基類
Base = declarative_base()

#創建表類
class Users(Base):
    __tablename__ = 'users'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32))
    extra = Column(String(16))

    __table_args__ = (
        UniqueConstraint('nid','name',name='uix_nid_name'),
        Index('ix_name_extra','name','extra'),
    )

#一對多
#外鍵關聯的表要先創建
class Favor(Base):
    __tablename__ = 'favor'
    nid = Column(Integer,primary_key=True)
    caption = Column(String(50),default='red',unique=True)

class Person(Base):
    __tablename__ = 'person'
    nid = Column(Integer,primary_key=True)
    name = Column(String(32),index=True,nullable=True)
    favor_id = Column(Integer,ForeignKey('favor.nid'))

#多對多,需要創建三張表
class Group(Base):
    __tablename__ = 'group'
    nid = Column(Integer,primary_key=True)
    name = Column(String(64),unique=True,nullable=False)
    port = Column(Integer,default=22)

class Server(Base):
    __tablename__ = 'server'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    hostname = Column(String(64),unique=True,nullable=False)

class ServerToGroup(Base):
    __tablename__ = 'servertogroup'
    nid = Column(Integer,primary_key=True,autoincrement=True)
    sever_id = Column(Integer,ForeignKey('server.nid'))
    group_id = Column(Integer,ForeignKey('group.nid'))

#由於上面只是在代碼級別實現,還沒真正的創建表,所有還需一個執行動作
def init_db():
    Base.metadata.create_all(engine)

def drop_db():
    Base.metadata.drop_all(engine)
View Code

 

操作表

  在操作之前,還需要做兩步

  第一步:導模塊

#操作表時用到,sessionmaker用於實例操作表的對象,relationship在表類中定義,方便查詢
from sqlalchemy.orm import sessionmaker,relationship

    第二步:創建操作對象

Session = sessionmaker(bind=engine)
session = Session()

 

  增 add  add_all(列表)

#增
obj = Users(name='alex0',extra='sb')
session.add(obj)
session.add_all([
    Users(name='alex1',extra='sb'),
    Users(name='alex2',extra='sb')
])
session.commit()

   刪 delete

#刪除
session.query(Users).filter(Users.nid>2).delete()
session.commit()

   改 update

#改
session.query(Users).filter(Users.nid<2).update({Users.name:Users.name + '666'},synchronize_session=False)
session.commit()

   查 filter  filter_by

#查
r = session.query(Users).all()
print(r)
r2 = session.query(Users.name,Users.extra).all()
print(r2)
r3 = session.query(Users).filter_by(nid=2).all()
print(r3)
r4 = session.query(Users).filter_by(name='alex').first()
print(r4)

 

 

 

 

  

  

  

  

  

  

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM