sqlalchemy

sqlalchemy的使用

  • 连接数据库
from sqlalchemy import create_engine
engine = create_engine('sqlite:///:memory:', echo=True)

echo=True 调试的时候使用,显示sql代码

sqlite:///DB_PATH

  • 简介及
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
  • 定义继承
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String)
fullname = Column(String)
password = Column(String)
def __repr__(self):
    return "<User(name='%s', fullname='%s', password='%s')>" % (
                         self.name, self.fullname, self.password)
  • 创建表
Base.metadata.create_all(engine)
  • 对映射的类创建实例
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
ed_user.name
str(ed_user.id)

注:通过上面语句可以修改User表中的数据,但是会发现ed_user.id是空的,因为这时修改的数据,没有进行数据持久化,没有写入数据库中。

  • 创建session 使数据持久化
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
  • 添加一条记录
ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
session.add(ed_user)
our_user = session.query(User).filter_by(name='ed').first()

注:上面的方法是添加一条,并且查询 name = ‘ed’ 的记录

  • 添加多条

session.add_all([
User(name=’wendy’, fullname=’Wendy Williams’, password=’foobar’),
User(name=’mary’, fullname=’Mary Contrary’, password=’xxg527’),
User(name=’fred’, fullname=’Fred Flinstone’, password=’blah’)])

  • 修改ed_user的密码
    ed_user.password = ‘f8s7ccs’

  • 查看那些被修改但是没有提交的脏数据
    session.dirty
    IdentitySet([])

  • 查看新添加的数据
    session.new # 查看到有新添加的三条
    IdentitySet([,
    ,
    ])

  • 提交上面更改 写入到磁盘

session.commit()
ed_user.id

注:这里就可以看到 id的值了

  • 回滚
ed_user.name = 'Edwardo'
fake_user = User(name='fakeuser', fullname='Invalid', password='12345')
session.add(fake_user)
session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()

注:通过上面的查询,可以直到数据已经写入到当前的事务

session.rollback()
ed_user.name

u’ed’

fake_user in session

False
注: 可以看到fake_user不存在 session中

session.query(User).filter(User.name.in_([‘ed’, ‘fakeuser’])).all()
通过上面查询,无法查到fakeuser用户
<<<<<<< HEAD

  • 查询
for instance in session.query(User).order_by(User.id):
    print(instance.name, instance.fullname)

for name, fullname in session.query(User.name, User.fullname):
    print(name, fullname)

注:查询结果是返回一个列表

  • 查询 给一个列加label
for row in session.query(User.name.label('name_label')).all():
print(row.name_label)

注:加标签后,查询时输入标签即可

  • 查询 给一个表 alise

    from sqlalchemy.orm import aliased
    user_alias = aliased(User, name=’user_alias’)
    for row in session.query(user_alias, user_alias.name).all():

    print(row.user_alias)
    

    + 查询 limit 实现使用 python的slices

    1
    2
    3
    4
    ed_user.name = 'Edwardo'
    fake_user = User(name='fakeuser', fullname='Invalid', password='12345')
    session.add(fake_user)
    session.query(User).filter(User.name.in_(['Edwardo', 'fakeuser'])).all()

56222fd9bc66c3be128adb5374afd7c7a0bd0f67