SQLAlchemy使用

建立表

使用SQLAlchemy建立表並處理數據有兩種用法html

Table對象方式

from sqlalchemy import create_engine, MetaData, select
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey

# 獲取數據庫引擎
engine = create_engine('mysql://root:root1234@localhost/test_alcm', echo=True)
# 綁定引擎
metadata = MetaData(engine)

# 定義表格
user = Table('user', metadata,
             Column('id', Integer, primary_key=True),
             Column('name', String(50)),
             )

address = Table('address', metadata,
                Column('id', Integer, primary_key=True),
                Column('user_id', None, ForeignKey('user.id')),
                Column('email', String(128), nullable=False)
                )
# 建立表
metadata.create_all()

# 調用engine.execute執行sql語句,查看執行結果
result = engine.execute('show tables')
print(result.fetchall())
複製代碼

映射類方式

from sqlalchemy import create_engine
from sqlalchemy import Column, Date, Integer, String, ForeignKey
from sqlalchemy.ext.declarative import declarative_base

# 獲取數據庫引擎,echo爲 True時,程序運行時調試信息會打印出來
engine = create_engine('sqlite:///memory.db', echo=True)

# 基本類
Base = declarative_base()

# 建立映射類
class User(Base):
    __tablename__ = 'user'  # 表的名字

    # 定義各字段
    id = Column(Integer, primary_key=True)
    name = Column(String(50))

    def __str__(self):
        return self.id

# 建立表
Base.metadata.create_all(engine)
複製代碼

使用已經存在的表

實際應用時,每每表都已經存在,並不須要建立,只需把它們」導入」進來便可,這時就得使用 autoload 參數。python

from sqlalchemy import create_engine, MetaData
from sqlalchemy import Table, Column, Date, Integer, String, ForeignKey

# 獲取數據庫引擎
engine = create_engine('sqlite:///school.db', echo=False)
# 綁定引擎
metadata = MetaData(engine)

# 使用autoload加載表
user = Table('user', metadata, autoload=True)
address = Table('address', metadata, autoload=True)
複製代碼

若是 MetaData 沒有綁定引擎,則另需指定 autoload_with 參數:mysql

user = Table('user', metadata, autoload=True, autoload_with=engine)
複製代碼

數據的增刪改查

針對上述兩種建表的方式,表的增刪改查操做也稍有區別。sql

Table對象方式

  • 插入記錄
# 獲取鏈接對象
conn = engine.connect()

# 插入記錄
conn.execute(user.insert(), {'id': 1, 'name': 'Alice'})
conn.execute(user.insert(), {'id': 2, 'name': 'Bob'})
# 或者按照下面的方式建立
sql = user.insert().values(id=3, name='Lucy')
conn.execute(sql)
conn.close()
複製代碼
  • 修改
sql = user.update().where(user.c.id == 1).values(name='Amy')
conn.execute(sql)
conn.close()
複製代碼
  • 刪除
sql = user.delete().where(user.c.id > 2)
conn.execute(sql)
conn.close()
複製代碼
  • 查詢
# 查詢user表裏的內容
sql = select([user, ])
res = conn.execute(sql)
print(res.fetchall())  # [(1, 'Amy'), (2, 'Bob')]

# 按照id排序
sql = select([user.c.name]).order_by(user.c.id)
res = conn.execute(sql)
print(res.fetchall())  # [('Amy',), ('Bob',)]
conn.close()
複製代碼

映射類方式

  • 插入記錄
# 建立與數據庫的會話session class
Session = sessionmaker(bind=engine)
# 獲取session,操做完畢後關閉。Session對象可視爲當前數據庫鏈接。
session = Session()

# 插入記錄
user = User(id=1, name='Alice')
session.add(user)
# 添加多條記錄
session.add_all([
    User(id=2, name='Bob'),
    User(id=3, name='Lucy')
])
# 提交以上操做
session.commit()
複製代碼
  • 修改
session.query(User).filter(User.id == 1).update({'name': 'Amy'})
session.commit()
複製代碼
  • 刪除
session.query(User).filter(User.id > 2).delete()
session.commit()
複製代碼
  • 查詢
# 查詢
ret = session.query(User).filter(User.name.in_(['Amy', 'Bob'])).all()
print(ret)  # [<__main__.User object at 0x10e162390>, <__main__.User object at 0x10e162400>]

# 查詢User表id最小的用戶
ret = session.query(User).order_by(User.id).first()
print(ret.name)  # Amy
複製代碼

Refrence

SQLalchemy —— 建立數據庫、表
Python筆記之SqlAlchemy使用數據庫

相關文章
相關標籤/搜索