要使用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)
一對多創建表,重點就是外鍵
#一對多
#外鍵關聯的表要先創建
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)
操作表
在操作之前,還需要做兩步
第一步:導模塊
#操作表時用到,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)
