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使用数据库

相关文章
相关标签/搜索