Python SQLAlchemy

一、连接及创建类

from sqlalchemy import create_engine
from sqlalchemy.orm import Session
from sqlalchemy.ext.automap import automap_base
# 连接数据库:
engine = create_engine('mysql+pymysql://root:password@localhost:3306/myDb')
# 创建与表名匹配的映射类:
Base = automap_base()
Base.prepare(engine, reflect=True)
Metadata = Base.classes.FN_Metadata
Resource = Base.classes.FN_Resource
Task = Base.classes.FN_Task
Config = Base.classes.SYS_Config
User = Base.classes.SYS_User
db_session = Session(engine)

 

二、新增

#新增
#方式一
session.add(User(user_id=1, user_name='test'))
session.add(Config(config_id=1, config_name='test'))
session.commit()
session.close()
#方式二
session.add_all([
    User(user_id=1, user_name='test'),
    Config(config_id=1, config_name='test')
])
session.commit()
session.close()

获取新增项的id:

user = User(name='test')
session.add(user)
session.commit()
print(user.id)

 

三、查询

#结果的类型
instance
instance of list
keyed tuple of list
value of list

#基本查询
session.query(User).filter_by(username='abc').all()
session.query(User).filter(User.username=='abc').all()
session.query(Blog).filter(Blog.create >= 0).all()
session.query(Blog).filter(Blog.create >= 0).first()
session.query(Blog).filter(Blog.create >= 0 | Blog.title == 'A').first()
session.query(Blog).filter(Blog.create >= 0 & Blog.title == 'A').first()
session.query(Blog).filter(Blog.create >= 0).offset(1).limit(1).scalar()
session.query(User).filter(User.username ==  'abc').scalar()
session.query(User.id).filter(User.username ==  'abc').scalar()
session.query(Blog.id).filter(Blog.create >= 0).all()
session.query(Blog.id).filter(Blog.create >= 0).all()[0].id
dict(session.query(Blog.id, Blog.title).filter(Blog.create >= 0).all())
session.query(Blog.id, Blog.title).filter(Blog.create >= 0).first().title
session.query(User.id).order_by('id desc').all()
session.query(User.id).order_by('id').first()
session.query(User.id).order_by(User.id).first()
session.query(User.id).order_by(-User.id).first()
session.query('id', 'username').select_from(User).all()
session.query(User).get('16e19a64d5874c308421e1a835b01c69')

#多表查询
session.query(Blog, User).filter(Blog.user == User.id).first().User.username
session.query(Blog, User.id, User.username).filter(Blog.user == User.id).first().id
session.query(Blog.id,
              User.id,
              User.username).filter(Blog.user == User.id).first().keys()

#条件查询
from sqlalchemy import or_, not_
session.query(User).filter(or_(User.id == '',
                               User.id == '16e19a64d5874c308421e1a835b01c69')).all()
session.query(User).filter(not_(User.id == '16e19a64d5874c308421e1a835b01c69')).all()
session.query(User).filter(User.id.in_(['16e19a64d5874c308421e1a835b01c69'])).all()
session.query(User).filter(User.id.like('16e19a%')).all()
session.query(User).filter(User.id.startswith('16e19a')).all()
dir(User.id)

#函数
from sqlalchemy import func
session.query(func.count('1')).select_from(User).scalar()
session.query(func.count('1'), func.max(User.username)).select_from(User).first()
session.query(func.count('1')).select_from(User).scalar()
session.query(func.md5(User.username)).select_from(User).all()
session.query(func.current_timestamp()).scalar()
session.query(User).count()

 

四、删除

#删除
#方式一
session.query(User).filter(User.user_id == 1).first().delete()
session.commit()
session.close()
#方式二
user = session.query(User).filter(User.user_id == 1).first()
session.delete(user)
session.commit()
session.close()

 

五、修改

#修改
#方式一
session.query(User).filter(User.user_name == 'abc').update({'name': 'test'})
session.commit()
session.close()
#方式二
user = session.query(User).filter_by(user_name='abc').scalar()
user.name = 'test'
session.commit()
session.close()

 

六、异常

try:
    pass
except Exception as e:
    logging.error('[x] %s' % e)
    print('[x] %s' % e)  

#必填项为空
sqlalchemy.exc.IntegrityError
#字段类型错误
sqlalchemy.exc.InternalError

 

七、常见问题

1. SQLAlchemy不是线程安全的,使用多线程、多进程时,需要使用特殊方法保证安全:

(1)每个进程都创建一个新的Session对象

db_session = Session()

(2)使用pymysql库

 

 

引用说明:

http://www.codexiu.cn/python/SQLAlchemy%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B/73/529/

 

转载请注明出处。

posted @ 2019-11-01 13:43  沐水杉  阅读(507)  评论(0)    收藏  举报