使用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
复制代码