使用代码实现以下SQL语句创建表结构并插入数据:
CREATE TABLE user ( id INTEGER NOT NULL AUTO_INCREMENT, name VARCHAR(32), password VARCHAR(64), PRIMARY KEY (id) ); INSERT INTO user(name, password) VALUES('fone', 'zff933'); INSERT INTO user(name, password) VALUES('alex', 'alex3714');
代码范例:
from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, INTEGER, String from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:111111@localhost/t1", encoding='utf-8', echo=True) # echo=True表示输出详细执行过程 Base = declarative_base() # 生成orm基类 class User(Base): __tablename__ = 'user' # 表名 id = Column(INTEGER, primary_key=True) name = Column(String(32)) password = Column(String(64)) Base.metadata.create_all(engine) # 创建表结构 Session_class = sessionmaker(bind=engine) # 创建与数据库的会话session class,即这里返回的是一个class,不是实例 Session = Session_class() # 生成session实例 user_obj = User(name='fone', password='zff933') # 生成要创建的数据对象,插入INSERT user_obj2 = User(name='alex', password='alex3714') # 生成要创建的数据对象 # 此时还没创建对象,表user仍为空 Session.add(user_obj) # 把要创建的数据对象添加到这个session,稍后统一创建 Session.add(user_obj2) # 把要创建的数据对象添加到这个session,稍后统一创建 # 此时还没创建对象,表user仍为空 Session.commit() # 统一提交,此时才会创建数据
# 查询 select
Session.query(User).filter(查询条件).first() # 返回查询到的第一条数据
Session.query(User).filter(查询条件).all() # 返回查询到的所有数据
例如(接上例代码):
select_data = Session.query(User).filter(User.id > 3).all()
注意,这里返回的select_data是一个内存对象,需要调用才能显示数据:
print(select_data[0].id, select_data[0].name, select_data[0].password)
若只取第一条数据则不用指定列表索引。
如果想要直接返回数据,可以在User类中添加返回函数:
def __repr__(self): return '[%s] %s: %s' % (self.id, self.name, self.password)
多条件查询:接多个.filter(条件)即可
select_data = Session.query(User).filter(User.id > 3).filter(User.id < 6).all()
filter()中可以使用的比较符有:==、!=、.like('%ed')
% 用于匹配任意字符
# 修改 update
采用直接赋值的方式,如(User类中没有添加返回函数):
select_data[0].name = 'Fone Z' # Session.rollback() Session.commit() # 没有commit就无法成功修改数据
关于回滚 rollback:
如果在commit之前执行rollback,则无法修改数据(如上述注释部分)。同理,若add之后commit之前执行了rollback,则同样无法插入数据,但此时的最新自增ID会加1(截图演示),即这里的机制是先插入数据,但遇到rollback又删除了。(如下例)
my_user = Session.query(User).filter_by(id=5).first() my_user.name = "Jack" fake_user = User(name='Rain', password='12345') Session.add(fake_user) print(Session.query(User).filter(User.name.in_(['Jack', 'rain'])).all()) # 这时看session里有刚添加和修改的数据 Session.rollback() # rollback清除了修改的内容 Session.commit()
# 删除 delete
Session.delete(my_user)
Session.commit()
# 分组 group by 并统计
from sqlalchemy import func print(Session.query(func.count(User.name), User.name).group_by(User.name).all())
打印结果:
[(1, 'alex'), (1, 'Fone Z'), (1, 'Rain')]
相当于原生SQL:
SELECT count(user.name) AS count_1, user.name AS user_name FROM user GROUP BY user.name;