Python教程

python学习笔记第9章:数据库操作

本文主要是介绍python学习笔记第9章:数据库操作,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

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 : 模糊的字

 

统计行数

  1. 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)   

 

#更新多个

  1. update_many({条件},{要更新的内容})    
  2. update_many({},{要更新的内容})    #更新全部

 

修改字段名

  1. 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():

这篇关于python学习笔记第9章:数据库操作的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!