SQLAlchemy基本使用
1.概念
是一种ORM库,十分方便,而且比一般的水平的程序员写的SQL要高效,但它最后还是会转化成相对应的SQL语句。
2.基本使用
1.创建连接
AccountInfoBase = declarative_base()
class AccountInfo(AccountInfoBase):
__tablename__ = 'user_table'
id = Column(Integer, primary_key=True)
real_name = Column(String)
nick_name = Column(String)
phone_num = Column(String)
birth_date = Column(DateTime)
db = dict(
user='conn',
pswd='conn',
host='172.28.249.142',
port=13357,
dbname='zhencongpeng_test',
)
engine = create_engine('mysql+pymysql://{user}:{pswd}@'
'{host}:{port}/{dbname}?charset'
'=utf8'.format(**db))
Session = sessionmaker(bind=engine)
session = Session()
在代码中我们可以看出我们首先是创建了一个类,这个类其实就是对应表的列,然后我们以后所有的操作都是利用session来操作
2.增
myinsert1 = AccountInfo(id=1,real_name='kiki',nick_name='do you love me',phone_num='15913444356',birth_date='2016-09-11 11:11:11')
session.add(myinsert1)
这是单体插入
myinsert1 = AccountInfo(id=13,real_name='kiki',nick_name='do you love me',phone_num='15913444356',birth_date='2016-09-11 11:11:11')
myinsert2 = AccountInfo(id=12, real_name='kiki', nick_name='do you love me', phone_num='15913444356',birth_date='2016-09-11 11:11:11')
mylist = [myinsert1,myinsert2]
session.add_all(mylist)
queryans = session.query(AccountInfo)
for i in queryans:
print("id=%d,real_name=%s,nick_name=%s,phone_num=%s,birth_date=%s"%(i.id,i.real_name,i.nick_name,i.phone_num,i.birth_date))
这是批量插入
注意:
若重复插入主键相同的语句会报错,插入后必须commit,不然不会生效
3.查
queryans = session.query(AccountInfo)
for i in queryans:
print("id=%d,real_name=%s,nick_name=%s,phone_num=%s,birth_date=%s"%(i.id,i.real_name,i.nick_name,i.phone_num,i.birth_date))
这是最基本的查询,相当于select *
queryans = session.query(AccountInfo).filter(AccountInfo.real_name=='jj',AccountInfo.nick_name=='kk')
for i in queryans:
print("id=%d,real_name=%s,nick_name=%s,phone_num=%s,birth_date=%s" % (
i.id, i.real_name, i.nick_name, i.phone_num, i.birth_date))
filter相当于sql中的条件语句,当他们都为真的时候才符合条件,不同条件可以用,隔开
4.删
session.query(AccountInfo).filter(AccountInfo.id<10).delete()
queryans = session.query(AccountInfo)
for i in queryans:
print("id=%d,real_name=%s,nick_name=%s,phone_num=%s,birth_date=%s" % (
i.id, i.real_name, i.nick_name, i.phone_num, i.birth_date))
其实删除就是查询,把符合条件的都删除,记住要commit
5.改
uuser = session.query(AccountInfo).filter(AccountInfo.id>10)
for i in uuser:
i.nick_name='kkkkkkkkkkk'
session.commit()
queryans = session.query(AccountInfo)
for i in queryans:
print("id=%d,real_name=%s,nick_name=%s,phone_num=%s,birth_date=%s" % (
i.id, i.real_name, i.nick_name, i.phone_num, i.birth_date))
我们查询出来的结果,只要我们对其操作,他都会更新到相对应的数据,可以想象为浅拷贝,所以要谨慎操作
6.query()操作
label():起别名
limit(n):限制返回条数,默认返回前n条,若原来记录总数<n,则返回全部
all():返回所有结果
one():查询结果当且仅当只有一条的时候不会报错,返回一个对象
first():尝试性取第一条,若结果为空则为None
distinct():相当于在select后加一个distinct,和sql中的distinct一样
order_by(Class.column.desc()/asc()):排序
group_by():单独用的时候可以达到distintc某一列的效果,可和其他函数一起用
count():返回总体的数量
having():通常和group_by一起用,单用的话和filter差不多
7.func的一些函数,主要用于统计,配合
1.count():计数
2.sum():和
8.原生sql
session.execute(原生sql)