使用SQLAlchemy建立表並處理數據有兩種用法html
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
# 獲取鏈接對象
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
複製代碼