9.1Mongodb
1. 连接
from pymongo import MongoClient
def conMon(collection):
client = MongoClient(
'mongodb://用户名:passwd@ip:port,172.20.1.7:27017,10.176.2.2:27017/admin')
db = client.数据库名称
c = db.get_collection(collection)
return c
#admin审计数据库
c = conMon(‘表名’)
2.查询
find_one({})
find({})
模糊搜索
"property." : {"$not" : re.compile(r'杭州|abc')} #r非必须
"property.request" : {'$regex':'短信'} #$regex : 模糊的字
统计行数
- count_documents({"region": region_id})
去重
db.getCollection("g_kdzz_map").distinct("property.日期",
{
"property.type_detail" : "质差小区"
}
)
设置超时时间
data = c.find({},{},no_cursor_timeout = True)
data.close()
设置为永不超时,在执行完毕手动关闭
3.修改
修改/新增
插入
新增
c.insert_one({'property.数据日期': c1}) #插入一条数据,
c.insert_one(doc)
c.insert_many(doc)
更新,默认不存在字段时插入字段
c.update_one({'property.数据日期': c1}, #查询条件
{'$set':{‘property.ab.cd’:3}}, #要更新的字段
upsert=True) #缺省False,为True查询不到会插入文档
c.update_one({'property.手机号':bill_id},
{'$set':
{'update_time':update_time},
'$push':
{'property.major_info':
{'major':major,
'bill_id':bill_id }}},
upsert=True)
c.update_one({'property.手机号':bill_id},
{'$push':
{'property.major_info': “a1”
}},
upsert=True)
#更新多个
- update_many({条件},{要更新的内容})
- update_many({},{要更新的内容}) #更新全部
修改字段名
- update_many({"update_time":{"$gte" : ("2021")}},
{"$rename":
{"property.合计" : "property.占比" }})
#原字段名:新字段名
字段自增
{"$set":{ },
"$inc":{"version":1} #和set在一个花括号内
}
添加索引
c.ensureIndex({"property.编号":1}) #1
c.ensureIndex({"property.date":1,"update_time":1}) #多个字段加索引
4.删除
删除文档
c.delete_one({'property.id_act':row}) #删除一条
c.delete_many #删除多条
c.deleteMany({"property.type_detail" : "小区",
"property.region" : NumberInt(0)});
删除字段
c.update_one({'property.数据日期': c1}, #查询条件
{'$unset':{ 'property.is_disabled':'' }}, #要删除的字段
c.update_many() #删除查询到的多条数据
删除数组中符合条件的项
c.update_one({"property.user_id" : “id”}, #查询条件
{"$pull":{"property.rights":{"role":"test",
"depart":"江干"}}})
#在数组property.rights中,删除role为test,depart为江干的项
5.其他
创建索引
from pymongo import ASCENDING
c.create_index([(‘u_id’,ASCENDING)]) #在u_id列创建自增长索引
c.hint([(‘_id’,ASCENDING)]) #指定使用_id为索引
null
python中用None代替
判断游标结果集是否为空,适用各种数据库
if len(list(data)) == 0 #等于0为空
9.2racle
1.连接
导入模块,安装oracle客户端
import cx_Oracle
#cx_Oracle依赖oracle客户端,环境变量找不到客户端时,用以下语句指定
#cx_Oracle.init_oracle_client(lib_dir=r"C:\Program Files\instantclient_19_10")
创建连接
def conOra(user='',password='' , ip_port_instan='8.8.8.8/rhcl' , encoding = 'UTF-8',nencoding ='UTF-8'):
connection = cx_Oracle.connect(user,password, ip_port_instan , encoding='UTF-8', nencoding='UTF-8')
return connection.cursor()
#return connection #如需使用提交回滚等操作,不能直接返回游标
使用连接
cursor = conOra()
#db = conOra() #如需使用提交回滚等操作,不能直接返回游标
#cursor = db.cursor()
执行命令(单引号,双引号,三引号均可)
cursor.execute(''select name from level_zone_result2'')
cursor.execute( f''select {name} from level_zone'')
执行命令方式二
sql = ''select NAME from t1''
sql = ""select id from t1""
cursor.execute(sql)
提交回滚
db.rollback()
db.commit()
遍历查询结果游标
sql = ""select id from t1""
cursor.execute(sql)
for i in cursor.fetchall():
2.添加insert into t1
insert into t1 (字段) values(值) #字符串值要用引号,字段不用引号
sql = f''' insert into t1 (审核时间,选择数量,类型,数据更新时间)
values (to_date('{task['proper']['ad_date']}','YYYY-MM-DD HH24:MI:SS'),
{i['property']['count']},
'{i['property']['reason']}', #字符串类型同样要加引号
sysdate ) ''' #使用系统当前时间
#因为涉及变量,用 f'''{}格式。花括号外加引号不会影响变量引用
#非sysdate类型需用to_date(‘时间’,’格式’)转换字符串
Merge into
merge into yytb t1
using yytb_tmp t2
on (t1.编号=t2.编号)
when matched then
update set t1.a=t2.a
where c>3
when not matched then
insert (c1,c2,c3)
values (t2.a,t2.b,t2.c) '''
存在更新,不存在插入,可以把数据插入临时表t2进行更新
sql = ''' merge into ivr t1
using ivr_tmp t2
on (t1.语音项目编号=t2.语音项目编号)
when matched then
update set t1.营 = t2.营,t1.编号 = t2.编号
where t1.成功量<>t2.成功量 or t1.状态<>t2.状态
when not matched then
insert (语音编号,营业)
values(t2.语音编号,t2.营业) '''
sql2 = '''merge into scene t1 using scene_tmp t2 on (t1.场景 = t2.场景)
when matched then
update set t1.分公司 = t2.分公司,t1.网格 = t2.网格 where 1=1
when not matched then
insert (c1,c2,c3) VALUES(t2.分公司,t2.网格) '''
注:on连接的字段出现在update语句可能会出错,不带where条件也可能出错
添加字段
alter table t1 add c1 字段类型;
添加主键
alter table zg_scene add primary key (字段名);
插入空值
‘’ #空的双引号
插入日期
直接datetime.now() ,不用to_date
或 sysdate #有时会出错
添加索引
CREATE INDEX i1 ON t1(c1)
3.删除delete from t1 where num = 7
sql = f''' delete from t1 where 申请时间 <
to_date('{(time - datetime.timedelta(180)).strftime('%Y-%m-%d%H:%M:%S')}', 'YYYY-MM-DD HH24:MI:SS') '''
#删除指定日期之前的数据
#删除user_id重复的数据
delete from t1 where rowid not in (select max(rowId) from t1 group by user_Id)
删除主键(不用写字段,主键就一个)
ALTER TABLE t1 DROP PRIMARY KEY ;
4.修改update t1 set
update t1 set (字段) = (值)
用一个表的字段更新另一个表的字段
merge into A using B on (A.ID =B.G_ID) when matched THEN update set A.五G = B.h1
改字段名
alter table t1 rename column c1 to c2;
改字段类型
alter table t1 modify c1 varchar2(22)
改字段长度
ALTER TABLE t1 MODIFY 进度备注 varchar2(500)
5.查询select
#查询表字段类型
select * from all_tab_cols where table_name=’大写表名’
#查询当前系统时间
select sysdate from dual
#查询非重复项
SELECT * FROM t1 WHERE rowid IN (SELECT max(rowid) FROM t1 WHERE lng IS NOT NULL group by channel_id )
#查询表字段类型
SELECT * FROM ALL_TAB_COLS s WHERE table_name='HGY'
6.表操作
获取某个表的建表语句
select dbms_metadata.get_ddl('TABLE','表名大写') from dual;
清空表,无法rollback
truncate table t1
9.3MySQL
1. 连接
import pymysql
def conMysql():
db= pymysql.connect('ip:port','user','pass','数据库名称')
return db.cursor() #端口为默认3306可省略
cursor = conMysql()
sql = ''' '''
cursor.execute(sql)
cursor.commit() #游标可直接提交
2. 查询
cursor.execute(sql)
for i in cursor.fetchall():