Python学习笔记整理总结【ORM(SQLAlchemy)】
一、介绍
SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行SQL并获取执行结果。
优点:
隐藏了数据访问细节,“封闭”的通用数据库交互,ORM的核心。他使得我们的通用数据库交互变得简单易行,并且完全不用考虑该死的SQL语句。快速开发,由此而来。
ORM使我们构造固化数据结构变得简单易行。
缺点:
无可避免的,自动化意味着映射和关联管理,代价是牺牲性能(早期,这是所有不喜欢ORM人的共同点)。现在的各种ORM框架都在尝试使用各种方法来减轻这块(LazyLoad,Cache),效果还是很显著的。
第一个阶段:将SQLAlchemy的对象换成可执行的sql语句(使用者通过ORM对象提交命令;将命令交给SQLAlchemy Core(Schema/Types SQL Expression Language)转换成SQL)
第二个阶段:将sql语句交给数据库执行(匹配使用者事先配置好的egine;egine从连接池中取出一个链接;基于该链接通过Dialect调用DB API,将SQL转交给它去执行)
SQLAlchemy本身无法操作数据库,其必须以来pymsql等第三方插件,Dialect用于和数据API进行交流,根据配置文件的不同调用不同的数据库API,从而实现对数据库的操作
#1、MySQL-Python
mysql+mysqldb://<user>:<password>@<host>[:<port>]/<dbname>
#2、pymysql
mysql+pymysql://<username>:<password>@<host>/<dbname>[?<options>]
#3、MySQL-Connector
mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
#4、cx_Oracle
oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...] 安装:
pip install SQLAlchemy
pip install pymysql
#由于mysqldb依然不支持py3,所以这里我们用pymysql与sqlalchemy交互
二、sqlalchemy基本使用
注:
#类 ==>表
#对象 ==>表中的一行记录
<1>基本语法(增/删/改/查/回滚)
####用到的表结构1####
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:12344321@localhost/solo",
#mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
encoding='utf-8', echo=True) #echo=True 打印程序运行详细信息
Base=declarative_base() #生成orm基类 #多对一:假设多个员工可以属于一个部门,而多个部门不能有同一个员工(只有某些公司才把普通员工当成葫芦娃,身兼数职)
#类 ==>表
#对象 ==>表中的一行记录
class Dep(Base):
__tablename__='dep'
id=Column(Integer,primary_key=True,autoincrement=True)
dname=Column(String(64),nullable=False,index=True) class Emp(Base):
__tablename__='emp' #表名
id=Column(Integer,primary_key=True,autoincrement=True)
ename=Column(String(32),nullable=False,index=True)
dep_id=Column(Integer,ForeignKey('dep.id')) def init_db():
Base.metadata.create_all(egine) def drop_db():
Base.metadata.drop_all(egine) drop_db()
init_db()
Session=sessionmaker(bind=egine) #Session_class现在不是实例,而是类
session=Session() #生成Session实例
①增
#增
row_obj=Dep(dname='销售') #生成你要创建的数据对象//按关键字传参,无需指定id,因其是自增长的
session.add(row_obj) #把要创建的数据对象添加到这个session里, 一会统一创建
session.add_all([
Dep(dname='技术'),
Dep(dname='运营'),
Dep(dname='人事'),
]) session.commit() #提交,生成表
②删
#删
session.query(Dep).filter(Dep.id > 3).delete()
session.commit()
③改
#改
session.query(Dep).filter(Dep.id > 0).update({'dname':'翔哥'})
session.query(Dep).filter(Dep.id > 0).update({'dname':Dep.dname+'_SB'},synchronize_session=False)
session.query(Dep).filter(Dep.id > 0).update({'id':Dep.id*100},synchronize_session='evaluate') session.commit()
④查
#查所有,取所有字段
res=session.query(Dep).all() #for row in res:print(row.id,row.dname) #查所有,取指定字段
res=session.query(Dep.dname).order_by(Dep.id).all() #for row in res:print(row.dname) res=session.query(Dep.dname).first()
print(res) # ('翔哥_SB',) #过滤查
res=session.query(Dep).filter(Dep.id > 1,Dep.id <1000) #逗号分隔,默认为and
print([(row.id,row.dname) for row in res])
⑤回滚
# session.add xxoo //数据添加
# Session.rollback() //回滚
# Session.query xxoo //刚刚添加的数据不见了(也就是滚到了原来的状态)
<2>更多的查询操作
###用到的表结构2###
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:12344321@localhost/solo",
#mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
encoding='utf-8', echo=True) #echo=True 打印程序运行详细信息
Base=declarative_base() #生成orm基类 #多对一:假设多个员工可以属于一个部门,而多个部门不能有同一个员工(只有某些公司才把普通员工当成葫芦娃,身兼数职)
#类 ==>表
#对象 ==>表中的一行记录
class Dep(Base):
__tablename__='dep'
id=Column(Integer,primary_key=True,autoincrement=True)
dname=Column(String(64),nullable=False,index=True) class Emp(Base):
__tablename__='emp' #表名
id=Column(Integer,primary_key=True,autoincrement=True)
ename=Column(String(32),nullable=False,index=True)
dep_id=Column(Integer,ForeignKey('dep.id')) def init_db():
Base.metadata.create_all(egine) def drop_db():
Base.metadata.drop_all(egine) drop_db()
init_db()
Session=sessionmaker(bind=egine) #Session_class现在不是实例,而是类
session=Session() #生成Session实例 # 准备数据
session.add_all([
Dep(dname='技术'),
Dep(dname='销售'),
Dep(dname='运营'),
Dep(dname='人事'),
]) session.add_all([
Emp(ename='葫芦娃',dep_id=1),
Emp(ename='李杰',dep_id=1),
Emp(ename='武配齐',dep_id=1),
Emp(ename='李伟',dep_id=2),
Emp(ename='李钢弹',dep_id=3),
Emp(ename='张二丫',dep_id=4),
Emp(ename='李坦克',dep_id=2),
Emp(ename='王大炮',dep_id=4),
Emp(ename='牛榴弹',dep_id=3)
]) session.commit()
①条件、通配符、limit、排序、分组、连表、组合
#一、条件
sql=session.query(Emp).filter_by(ename='葫芦娃') #filter_by只能传参数:什么等于什么
res=sql.all() #sql语句的执行结果 res=session.query(Emp).filter(Emp.id>0,Emp.ename == '葫芦娃').all() #filter内传的是表达式,逗号分隔,默认为and,
res=session.query(Emp).filter(Emp.id.between(1,3),Emp.ename == '葫芦娃').all()
res=session.query(Emp).filter(Emp.id.in_([1,3,99,101]),Emp.ename == '葫芦娃').all()
res=session.query(Emp).filter(~Emp.id.in_([1,3,99,101]),Emp.ename == '葫芦娃') #~代表取反,转换成sql就是关键字not from sqlalchemy import and_,or_
res=session.query(Emp).filter(and_(Emp.id > 0,Emp.ename=='葫芦娃')).all()
res=session.query(Emp).filter(or_(Emp.id < 2,Emp.ename=='功夫熊猫')).all()
res=session.query(Emp).filter(
or_(
Emp.dep_id == 3,
and_(Emp.id > 1,Emp.ename=='功夫熊猫'),
Emp.ename != ''
)
).all() #二、通配符
res=session.query(Emp).filter(Emp.ename.like('%芦_%')).all()
res=session.query(Emp).filter(~Emp.ename.like('%芦_%')).all() #三、limit
res=session.query(Emp)[0:5:2] #四、排序
res=session.query(Emp).order_by(Emp.dep_id.desc()).all()
res=session.query(Emp).order_by(Emp.dep_id.desc(),Emp.id.asc()).all() #五、分组
from sqlalchemy.sql import func res=session.query(Emp.dep_id).group_by(Emp.dep_id).all()
res=session.query(
func.max(Emp.dep_id),
func.min(Emp.dep_id),
func.sum(Emp.dep_id),
func.avg(Emp.dep_id),
func.count(Emp.dep_id),
).group_by(Emp.dep_id).all() res=session.query(
Emp.dep_id,
func.count(1),
).group_by(Emp.dep_id).having(func.count(1) > 2).all() #六、连表
#笛卡尔积
res=session.query(Emp,Dep).all() #select * from emp,dep; #where条件
res=session.query(Emp,Dep).filter(Emp.dep_id==Dep.id).all()
# for row in res:
# emp_tb=row[0]
# dep_tb=row[1]
# print(emp_tb.id,emp_tb.ename,dep_tb.id,dep_tb.dname) #内连接
res=session.query(Emp).join(Dep)
#join默认为内连接,SQLAlchemy会自动帮我们通过foreign key字段去找关联关系
#但是上述查询的结果均为Emp表的字段,这样链表还有毛线意义,于是我们修改为
res=session.query(Emp.id,Emp.ename,Emp.dep_id,Dep.dname).join(Dep).all() #左连接:isouter=True
res=session.query(Emp.id,Emp.ename,Emp.dep_id,Dep.dname).join(Dep,isouter=True).all() #右连接:同左连接,只是把两个表的位置换一下 #七、组合
q1=session.query(Emp.id,Emp.ename).filter(Emp.id > 0,Emp.id < 5)
q2=session.query(Emp.id,Emp.ename).filter(
or_(
Emp.ename.like('%芦%'),
Emp.ename.like('%伟%'),
)
)
res1=q1.union(q2) #组合+去重
res2=q1.union_all(q2) #组合,不去重 print([i.ename for i in q1.all()]) #['葫芦娃', '李杰', '武配齐', '李伟']
print([i.ename for i in q2.all()]) #['葫芦娃', '李伟']
print([i.ename for i in res1.all()]) #['葫芦娃', '李杰', '武配齐', '李伟']
print([i.ename for i in res2.all()]) #['葫芦娃', '李杰', '武配齐', '李伟', '李伟', '葫芦娃']
②子查询
注意:子查询的sql必须用括号包起来,尤其在形式三中需要注意这一点
形式一:子查询当做一张表来用,调用subquery()
#示例:查出id大于2的员工,当做子查询的表使用 #原生SQL:
# select * from (select * from emp where id > 2); #ORM:
res=session.query(
session.query(Emp).filter(Emp.id > 8).subquery()
).all() 形式二:子查询当做in的范围用,调用in_
#示例:#查出销售部门的员工姓名 #原生SQL:
# select ename from emp where dep_id in (select id from dep where dname='销售'); #ORM:
res=session.query(Emp.ename).filter(Emp.dep_id.in_(
session.query(Dep.id).filter_by(dname='销售'), #传的是参数
# session.query(Dep.id).filter(Dep.dname=='销售') #传的是表达式
)).all() 形式三:子查询当做select后的字段,调用as_scalar()
#示例:查询所有的员工姓名与部门名 #原生SQL:
# select ename as 员工姓名,(select dname from dep where id = emp.dep_id) as 部门名 from emp; #ORM:
sub_sql=session.query(Dep.dname).filter(Dep.id==Emp.dep_id) #SELECT dep.dname FROM dep, emp WHERE dep.id = emp.dep_id
sub_sql.as_scalar() #as_scalar的功能就是把上面的sub_sql加上了括号 res=session.query(Emp.ename,sub_sql.as_scalar()).all()
③正查、反查
###用到的表结构3### from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column,Integer,String,ForeignKey
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:12344321@localhost/solo",
#mysql+mysqlconnector://<user>:<password>@<host>[:<port>]/<dbname>
encoding='utf-8', echo=True) #echo=True 打印程序运行详细信息
Base=declarative_base() #生成orm基类 #多对一:假设多个员工可以属于一个部门,而多个部门不能有同一个员工(只有某些公司才把普通员工当成葫芦娃,身兼数职)
#类 ==>表
#对象 ==>表中的一行记录
class Dep(Base):
__tablename__='dep'
id=Column(Integer,primary_key=True,autoincrement=True)
dname=Column(String(64),nullable=False,index=True) class Emp(Base):
__tablename__='emp'
id=Column(Integer,primary_key=True,autoincrement=True)
ename=Column(String(32),nullable=False,index=True)
dep_id=Column(Integer,ForeignKey('dep.id')) #在ForeignKey所在的类内添加relationship的字段,注意:
#1:Dep是类名
#2:depart字段不会再数据库表中生成字段
#3:depart用于Emp表查询Dep表(正向查询),而xxoo用于Dep表查询Emp表(反向查询),
depart=relationship('Dep',backref='xxoo') def init_db():
Base.metadata.create_all(egine) def drop_db():
Base.metadata.drop_all(egine) drop_db()
init_db()
Session=sessionmaker(bind=egine) #Session_class现在不是实例,而是类
session=Session() #生成Session实例 # 准备数据
session.add_all([
Dep(dname='技术'),
Dep(dname='销售'),
Dep(dname='运营'),
Dep(dname='人事'),
]) session.add_all([
Emp(ename='葫芦娃',dep_id=1),
Emp(ename='李杰',dep_id=1),
Emp(ename='武配齐',dep_id=1),
Emp(ename='李伟',dep_id=2),
Emp(ename='李钢弹',dep_id=3),
Emp(ename='张二丫',dep_id=4),
Emp(ename='李坦克',dep_id=2),
Emp(ename='王大炮',dep_id=4),
Emp(ename='牛榴弹',dep_id=3)
]) session.commit()
1.标准连表查询
# 示例:查询员工名与其部门名
res=session.query(Emp.ename,Dep.dname).join(Dep) #迭代器
for row in res:
print(row[0],row[1]) #等同于print(row.ename,row.dname) 2.基于relationship的正查、反查
#SQLAlchemy的relationship在内部帮我们做好表的链接 #查询员工名与其部门名(正向查)
res=session.query(Emp)
for row in res:
print(row.ename,row.id,row.depart.dname) #查询部门名以及该部门下的员工(反向查)
res=session.query(Dep)
for row in res:
# print(row.dname,row.xxoo)
print(row.dname,[r.ename for r in row.xxoo])
<3>关联问题
①外键关联(一对一)
# 外键关联
###用到的表 ###
from sqlalchemy import create_engine
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import String,Column,Integer,ForeignKey,DATE
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:12344321@localhost/solo",,
encoding="utf-8") Base = declarative_base() class Student(Base):
__tablename__ ="student"
id = Column(Integer,primary_key=True)
name = Column(String(32),nullable=False)
register_date = Column(DATE,nullable=False) def __repr__(self):
return "<%s name:%s>"%(self.id,self.name) class StudyRecord(Base):
__tablename__ = "study_record"
id = Column(Integer,primary_key=True)
day = Column(Integer,nullable=False)
status = Column(String(32),nullable=False)
stu_id = Column(Integer,ForeignKey("student.id")) #关联student表里的id my_student = relationship("Student",backref="my_study_record") # Student为关联的类 def __repr__(self):
return "<%s name:%s>" % (self.id, self.name) Base.metadata.create_all(engine) Session_class = sessionmaker(bind=engine)
session = Session_class() s1 = Student(name="solo",register_date="2016-10-26")
s2 = Student(name="alex",register_date="2015-10-26")
s3 = Student(name="eric",register_date="2014-10-26")
s4 = Student(name="rain",register_date="2013-10-26") r1 = StudyRecord(day=1,status="YES",stu_id=1)
r2 = StudyRecord(day=2,status="No",stu_id=1)
r3 = StudyRecord(day=3,status="YES",stu_id=1)
r4 = StudyRecord(day=1,status="YES",stu_id=2) session.add_all([s1,s2,s3,s4,r1,r2,r3,r4])
session.commit() #查询
#stu_obj = session.query(Student).filter(Student.name=="solo").first()
#print(stu_obj)
#<id:1 name:solo> #print(stu_obj.my_study_record)
#[<name:solo day:1 status:YES>, <name:solo day:2 status:No>, <name:solo day:3 status:YES>]
②多外键关联(一对多)
###orm_many_fk.py文件### #!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
from sqlalchemy import create_engine
from sqlalchemy import Integer,String,Column,ForeignKey
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker,relationship engine = create_engine("mysql+pymysql://root:12344321@localhost/solo",
encoding="utf-8",echo= True) Base = declarative_base() class Customer(Base):
__tablename__ = "customer"
id = Column(Integer,primary_key=True)
name = Column(String(32))
billing_address_id = Column(Integer,ForeignKey("address.id")) #账单地址
shipping_address_id = Column(Integer, ForeignKey("address.id")) #邮寄地址 #可以帮其他人买东西,也可以自己给自己买
def __repr__(self):
return "<name:%s billing_add:%s shipping_add:%s>"%(self.name,self.billing_address.street,
self.shipping_address.street) billing_address = relationship("Address",foreign_keys=[billing_address_id]) #必须写foreign_keys
shipping_address = relationship("Address",foreign_keys=[shipping_address_id]) class Address(Base):
__tablename__ = 'address'
id = Column(Integer, primary_key=True)
street = Column(String(32))
city = Column(String(32))
state = Column(String(32)) Base.metadata.create_all(engine)
###orm_api.py文件### #规矩:创建数据表要与增删改查的操作表分开,进行导入操作
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
from sqlalchemy.orm import sessionmaker
from test import orm_many_fk #此项为导入上一个文件 Session = sessionmaker(bind=orm_many_fk.engine)
session = Session() a1 = orm_many_fk.Address(street="Tiantongyuan",city="ChangPing",state="BJ")
a2 = orm_many_fk.Address(street="Wudaokou",city="HaiDian",state="BJ")
a3 = orm_many_fk.Address(street="DongGuan",city="QinHuangDao",state="HB") session.add_all([a1,a2,a3])
c1 = orm_many_fk.Customer(name="solo",billing_address_id=1,shipping_address_id=2)
c2 = orm_many_fk.Customer(name="Alex",billing_address_id=3,shipping_address_id=3) session.add_all([c1,c2])
cus_obj = session.query(orm_many_fk.Customer).filter_by(name="solo").first()
print(cus_obj)
session.commit()
③多外键关联(多对多)
现在来设计一个能描述“图书”与“作者”的关系的表结构,需求是
1.一本书可以有好几个作者一起出版
2.一个作者可以写好几本书
###many_to_many.py文件### #创建表结构:
#一本书可以有多个作者,一个作者又可以出版多本书
#!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi
from sqlalchemy import Table, Column, Integer,String,DATE, ForeignKey
from sqlalchemy.orm import relationship
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import create_engine
from sqlalchemy.orm import sessionmaker engine = create_engine("mysql+pymysql://root:12344321@localhost/solo",
encoding="utf-8") Base = declarative_base() #创建book_m2m_author表,表不用用户操作,系统自动维护,自动添加数据
book_m2m_author = Table('book_m2m_author', Base.metadata,
Column('book_id',Integer,ForeignKey('books.id')),
Column('author_id',Integer,ForeignKey('authors.id')),
) class Book(Base):
__tablename__ = 'books'
id = Column(Integer,primary_key=True)
name = Column(String(64))
pub_date = Column(DATE)
#关联Author类,secondary表示通过book_m2m_author表进行查询关联数据,backref反向查询也一样
authors = relationship('Author',secondary=book_m2m_author,backref='books')
###many_to_many_api.py文件### #!/usr/bin/env python
# -*- coding:utf-8 -*-
# _author_soloLi from sqlalchemy.orm import sessionmaker
from day04 import many_to_many Session = sessionmaker(bind=many_to_many.engine)
session = Session() b1 = many_to_many.Book(name="learn python with Alex",pub_date="2014-05-02")
b2 = many_to_many.Book(name="learn linux with Alex",pub_date="2015-05-02")
b3 = many_to_many.Book(name="learn go with Alex",pub_date="2016-05-02") a1 = many_to_many.Author(name="Alex")
a2 = many_to_many.Author(name="Jack")
a3 = many_to_many.Author(name="Rain") #关键来了,创建关联关系
b1.authors = [a1,a3]
b3.authors = [a1,a2,a3] session.add_all([b1,b2,b3,a1,a2,a3])
session.commit() author_obj = session.query(many_to_many.Author).filter_by(name="Alex").first()
print(author_obj,author_obj.books) book_obj = session.query(many_to_many.Book).filter_by(id=2).first()
print(book_obj,book_obj.authors) # Alex [learn python with Alex, learn go with Alex]
# learn go with Alex [Alex, Jack, Rain] ##通过书删除作者##
#author_obj =s.query(Author).filter_by(name="Jack").first()
#book_obj = s.query(Book).filter_by(name="跟Alex学把妹").first()
#book_obj.authors.remove(author_obj) #从一本书里删除一个作者
#s.commit() ##直接删除作者##
#删除作者时,会把这个作者跟所有书的关联关系数据也自动删除
#author_obj =s.query(Author).filter_by(name="Alex").first()
# print(author_obj.name , author_obj.books)
#s.delete(author_obj)
#s.commit()
<4>中文问题
engine = create_engine("mysql+pymysql://root:12344321@localhost/solo") #修改查看数据库字符编码
mysql> alter database solo character set utf8;
Query OK, 1 row affected (0.00 sec) mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name | Value |
+------------------------+-------+
| character_set_database | utf8 |
Python学习笔记整理总结【ORM(SQLAlchemy)】的更多相关文章
- python学习笔记整理——字典
python学习笔记整理 数据结构--字典 无序的 {键:值} 对集合 用于查询的方法 len(d) Return the number of items in the dictionary d. 返 ...
- python学习笔记整理——集合 set
python学习整理笔记--集合 set 集合的用途:成员测试和消除重复的条目,进行集合运算 注意:花括号或set()函数可以用于创建集合. 注意:若要创建一个空的集合你必须使用set(),不能用{} ...
- python学习笔记整理——元组tuple
Python 文档学习笔记2 数据结构--元组和序列 元组 元组在输出时总是有括号的 元组输入时可能没有括号 元组是不可变的 通过分拆(参阅本节后面的内容)或索引访问(如果是namedtuples,甚 ...
- python学习笔记整理——列表
Python 文档学习笔记 数据结构--列表 列表的方法 添加 list.append(x) 添加元素 添加一个元素到列表的末尾:相当于a[len(a):] = [x] list.extend(L) ...
- Python学习笔记八:ORM框架SQLAlchemy
一:SQLAlchemy使用 1:实体类的创建 ORM中的实体类与一般的Python类不同,在其中,使用 __tablename__=""指明该类与数据库中某个表相对应,然后定义一 ...
- python 学习笔记整理
首先自我批评一下,说好的一天写一篇博客,结果不到两天,就没有坚持了,发现自己做什么事情都没有毅力啊!不能持之以恒.但是,这次一定要从写博客开始来改掉自己的一个坏习惯. 可是写博客又该写点什么呢? 反正 ...
- python学习笔记之paramiko和sqlalchemy (第九天)
参考银角大王 :http://www.cnblogs.com/wupeiqi/articles/5095821.html http://www.cnblogs.com/wupeiqi/articles ...
- Python学习笔记整理总结【Django】【MVC/MTV/路由分配系统(URL)/视图函数 (views)/表单交互】
一.Web框架概述 Web框架本质上其实就是一个socket服务端,用户的浏览器其实就是一个socket客户端. #!/usr/bin/env python # -*- coding:utf-8 ...
- Python学习笔记整理总结【语言基础篇】
一.变量赋值及命名规则① 声明一个变量及赋值 #!/usr/bin/env python # -*- coding:utf-8 -*- # _author_soloLi name1="sol ...
随机推荐
- Java集合框架之TreeMap浅析
Java集合框架之TreeMap浅析 一.TreeMap综述: TreeMap在Map中的结构如下:
- Vue+webpack项目的多环境打包配置
背景:由于需要将应用部署到线上开发环境.线上测试环境.线上预发环境.线上生产环境,而每个环境的访问地址是不同的.如果每次更改请求地址未免有些繁琐,就考虑在本地进行一次性配置. 代码管理工具:git 代 ...
- 探索Asp net core3中的 项目文件、Program.cs和通用host(译)
引言 原文地址 在这篇博客中我将探索一些关于Asp.net core 3.0应用的基础功能--.csproj 项目文件和Program源文件.我将会描述他们从asp.net core 2.X在默认模版 ...
- 【Leetcode】【简单】【217. 存在重复元素】【JavaScript】
题目描述 217. 存在重复元素 给定一个整数数组,判断是否存在重复元素. 如果任何值在数组中出现至少两次,函数返回 true.如果数组中每个元素都不相同,则返回 false. 示例 1: 输入: [ ...
- http gzip压缩功能记录
版权声明:本文为博主原创文章,转载请附上原文出处链接. 本文链接:https://www.cnblogs.com/shaoshuai95928/articles/Tomcat.html 最近在spri ...
- 良许 | 听说,有个同事因为关闭服务器被打进 ICU ……
提问:你是如何关闭电脑的? 普通青年 文艺青年 二逼青年 你是属于哪一种呢? 实话说, 这三种良许都干过~ 还好我没有对服务器这么做, 否则-- 分分钟被打进 ICU -- 1. 关机命令知多少 对于 ...
- Python 单元测试框架系列:聊聊 Python 的单元测试框架(一):unittest
作者:HelloGitHub-Prodesire HelloGitHub 的<讲解开源项目>系列,项目地址:https://github.com/HelloGitHub-Team/Arti ...
- C++ 深入浅出工厂模式(初识篇)
初识工厂模式 我们先看工厂模式的介绍 这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式. 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻辑,并且是通过使用一个共同的接口来指向新创 ...
- 开发利器JRebel部署SpringBoot项目
不要以为年纪轻轻就跌倒了人生谷底,未来还有更大的下降空间等着你. idea下载和安装JRebel 激活JRebel 访问https://my.jrebel.com/ 使用facebook或twitte ...
- 装逼手册之 python中的内存分配的小秘密
装逼手册之 python中的内存分配的小秘密 虽然我们现在得益于时代和技术的发展,不用再担心内存的问题:但是遥想当年,都是恨不得一个钢镚掰成俩份用,所以我就想深入了解一下,在python中内存分配的一 ...