日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

python oracle orm_Python ORM

發布時間:2025/3/15 python 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python oracle orm_Python ORM 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

本章內容

ORM介紹

如果寫程序用pymysql和程序交互,那是不是要寫原生sql語句。如果進行復雜的查詢,那sql語句就要進行一點一點拼接,而且不太有重用性,擴展不方便。而且寫的sql語句可能不高效,導致程序運行也變慢。

為了避免把sql語句寫死在代碼里,有沒有一種方法直接把原生sql封裝好了并且以你熟悉的方式操作,像面向對象那樣?

ORM(object relational mapping),就是對象映射關系程序,簡單來說我們類似Python這種面向對象的程序來說一切皆對象,但是我們使用的數據庫卻都是關系型的,為了保證一致的使用習慣,通過orm將編程語言的對象模型和數據庫的關系模型建立映射關系,這樣我們在使用編程語言對數據庫進行操作的時候可以直接使用編程語言的對象模型進行操作就可以了,而不用直接使用sql語言。

ORM 相當于把數據庫也給你實例化了,在代碼操作MySQL中級又加了orm這一層。

ORM的優點:

隱藏了數據訪問細節,“封閉”的通用數據庫交互,ORM的核心。他使得我們的通用數據庫交互變得簡單易行,并且完全不用考慮該死的SQL語句。快速開發,由此而來。

ORM使我們構造固化數據結構變得簡單易行。

缺點:

無可避免的,自動化意味著映射和關聯管理,代價是犧牲性能(早期,這是所有不喜歡ORM人的共同點)。現在的各種ORM框架都在嘗試使用各種方法來減輕這塊(LazyLoad,Cache),效果還是很顯著的。

sqlalchemy安裝

安裝sqlalchemy

1 pip install SQLAlchemy2 pip install pymysql3 #由于mysqldb依然不支持py3,所以這里我們用pymysql與sqlalchemy交互

4 #雖然大家可能在python2.x中用習慣了mysqldb,但是在python3.x中已經不支持那個組件了。取而代之的是:pymysql

sqlalchemy基本使用

Dialect(數據庫方言)用于和數據API進行交流,根據配置文件的不同調用不同的數據庫API,從而實現對數據庫的操作,如:

1 MySQL-Python2 mysql+mysqldb://:@[:]/

3

4 pymysql5 mysql+pymysql://:@/[?]6

7 MySQL-Connector8 mysql+mysqlconnector://:@[:]/

9

10 cx_Oracle11 oracle+cx_oracle://user:pass@host:port/dbname[?key=value&key=value...]

基本的增、刪、改、查

importsqlalchemyfrom sqlalchemy importcreate_enginefrom sqlalchemy.ext.declarative importdeclarative_basefrom sqlalchemy importColumn, Integer, Stringfrom sqlalchemy.orm importsessionmaker

Base =declarative_base()

classUser(Base): __tablename__ = 'user' #表名

id = Column(Integer, primary_key=True) username = Column(String(100)) password = Column(String(100))

#定義函數的輸出方式,不然會以對象的形式輸出,<__main__.userobject>   def __repr__(self):

return 'name:%s,password:%s'%(self.username,self.password)

#創建實例并連接數據庫

engine = create_engine("mysql+mysqldb://woniu:1234@59.110.12.72:3306/wangjin?charset=utf8",echo=True) #echo 輸出日志的信息 #創建與數據庫的會話session class ,注意,這里返回給session的是個class,不是實例

db_session = sessionmaker(bind=engine) #實例和engine綁定

session = db_session() #生成session實例,相當于游標

#add user

user_obj = User(username='hello',password='python') #生成你要創建的數據對象

session.add(user_obj) #把要創建的數據對象添加到這個session里

session.commit() printuser_obj.username print user_obj.password #現此才統一提交,創建數據

#query

my_user = session.query(User).filter_by(username='hello').first() #根據條件去查詢

printmy_user.username,my_user.password

#edit

edit_user = session.query(User).filter_by(username='hello').all() edit_user.username = 'woniu' #賦值

edit_user.password = 'hehe'

session.commit() printmy_user.username,my_user.password

#del

del_user = session.query(User).filter_by(username='hello').all() for i indel_user: session.delete(i) session.commit()

#rallback

my_user = Session.query(User).filter_by(id=1).first()

my_user.name = "Jack"

fake_user = User(name='Rain', password='12345')

Session.add(fake_user)

print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #這時看session里有你剛添加和修改的數據

Session.rollback() #此時你rollback一下

print(Session.query(User).filter(User.name.in_(['Jack','rain'])).all() ) #再查就發現剛才添加的數據沒有了。

# Session

# Session.commit()

filter_by與filter的區別

my_user2 = Session.query(User).filter_by(id=27).all() #filter_by相等用‘=’

my_user3= Session.query(User).filter(User.id==27).all() #filter相等用‘==’

用法不同而已,filter 可以像寫 sql 的 where 條件那樣寫 > < 等條件,但引用列名時,需要通過 類名.屬性名 的方式。 filter_by 可以使用 python 的正常參數傳遞方法傳遞條件,指定列名時,不需要額外指定類名。,參數名對應名類中的屬性名

多條件查詢

objs = Session.query(User).filter(User.id>0).filter(User.id<7).all()

上面2個filter的關系相當于 user.id >1 AND user.id <7 的效果

from sqlalchemy import and_, or_ #且和or的關系

ret = session.query(Users).filter(and_(Users.id > 3, Users.name == 'eric')).all() #條件以and方式排列

ret = session.query(Users).filter(or_(Users.id < 2, Users.name == 'eric')).all() #條件以or方式排列

分組統計

from sqlalchemy importfuncprint(Session.query(func.count(User.name),User.name).group_by(User.name).all() )

Session.query(User).filter(User.name.like("Ra%")).count().all()

#輸出結果

4

[(1, 'alex'), (1, 'chongyang'), (4, 'liming')

外鍵關聯

importsqlalchemyfrom sqlalchemy importcreate_engine,func,ForeignKeyfrom sqlalchemy.ext.declarative importdeclarative_basefrom sqlalchemy importColumn,Integer,Stringfrom sqlalchemy.orm importsessionmaker,relationship

engine= create_engine("mysql+pymysql://woniu:123456@59.110.12.72/txadmin",encoding='utf-8')

Base=declarative_base()classStudent(Base):__tablename__ = 'student'id= Column(Integer,primary_key=True)

name= Column(String(32))

password= Column(String(64))def __repr__(self):return 'name:%s,password:%s'%(self.name,self.password)classAddress(Base):__tablename__ = 'addresses'id= Column(Integer,primary_key=True)

email_address= Column(String(32),nullable=False)

user_id= Column(Integer,ForeignKey('student.id'))

#允許你在student表里通過backref字段反向查出所有它在addresses表里的關聯項

student= relationship('Student',backref='addresses')def __repr__(self):return 'Address(email_address="%s")'%self.email_address

Base.metadata.create_all(engine)

db_session= sessionmaker(bind=engine)

session=db_session()#add user#user_obj = Student(name = 'alex',password='1234')#session.add(user_obj)#session.commit()#print(user_obj.name)#print(user_obj.password)

# 如果有多個對象需要添加,可以如下使用

session.add_all([obj1,obj2,obj3])

#add_address#add_obj = Address(email_address = 'hebeisheng',user_id = '2')#session.add(add_obj)#session.commit()##query## my_user = session.query(Student).filter_by(name='liming').all()#res = session.query(func.count(Student.name),Student.name).group_by(Student.name).all()#

#res1 = session.query(Student).filter(Student.name.like('li%')).count()#print(res1)#print(res)

#obj = session.query(Student).all()#

#

#for i in obj:#print(i.addresses)

#在addr_obj里直接插關聯的student表

#addr_obj = session.query(Address).all()#for i in addr_obj:#print(i.student.name)

#通過student對象方差關聯的address的記錄obj= session.query(Student).filter_by(name='liming').all()[2]print(obj.addresses)

#添加關聯對象

obj.addresses= [Address(email_address="r1@126.com"),Address(email_address="8888888.com")]

session.commit()print(obj.addresses)

#運行結果

[]

[Address(email_address="r1@126.com"), Address(email_address="8888888.com")]

#首先 第三個李明是沒有設置對應的地址的,所以為空,設置完畢后就可以看到對應的值了

多外鍵關聯

customer 表中的?billing_address_id 關聯 address表的ID

customer 表中的?shipping_address_id 關聯 address表的ID

importsqlalchemyfrom sqlalchemy importInteger,Column,String,ForeignKey,create_enginefrom sqlalchemy.ext.declarative importdeclarative_basefrom sqlalchemy.orm importrelationship,sessionmaker

engine= create_engine("mysql+pymysql://woniu:123456@59.110.12.72/txadmin",encoding='utf-8')

Base=declarative_base()classCustomer(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')) #建立外鍵

billing_address= relationship('Address',foreign_keys=[billing_address_id]) #注意這兩行

shipping_address = relationship('Address',foreign_keys=[shipping_address_id])#def __repr__(self):

#return '{name:%s,billing_addres:%s,shipping_address:%s}'%(self.name,self.billing_address,self.shipping_address)

classAddress(Base):__tablename__ = 'address'id= Column(Integer,primary_key=True)

street= Column(String(32))

city= Column(String(32))

state= Column(String(32))def __repr__(self):returnself.city

Base.metadata.create_all(engine)

db_session= sessionmaker(bind=engine)

session=db_session()#obj2 = Address(street = 'shipping_address',city='test',state='eee')#obj3 = Address(street = 'billing_address',city='test',state='eee')#session.add(obj2)#session.add(obj3)#

#session.commit()#

#

#obj = Customer(name = 'nima',billing_address = obj2,shipping_address = obj3)#session.add(obj)#session.commit()

res= session.query(Customer).filter(Customer.name == 'nima').first()print(res.name,dir(res))print(res.billing_address,res.shipping_address) #可以關聯得到外鍵,通過customer表,查看address表

多外鍵

mysql> descaddress;+--------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+--------+-------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| street | varchar(32) | YES | | NULL | |

| city | varchar(32) | YES | | NULL | |

| state | varchar(32) | YES | | NULL | |

+--------+-------------+------+-----+---------+----------------+

4 rows in set (0.00sec)

mysql> desccustomer;+---------------------+-------------+------+-----+---------+----------------+

| Field | Type | Null | Key | Default | Extra |

+---------------------+-------------+------+-----+---------+----------------+

| id | int(11) | NO | PRI | NULL | auto_increment |

| name | varchar(32) | YES | | NULL | |

| billing_address_id | int(11) | YES | MUL | NULL | |

| shipping_address_id | int(11) | YES | MUL | NULL | |

+---------------------+-------------+------+-----+---------+----------------+

4 rows in set (0.00sec)

mysql> select * fromcustomer;+----+---------+--------------------+---------------------+

| id | name | billing_address_id | shipping_address_id |

+----+---------+--------------------+---------------------+

| 6 | liming | 6 | 7 |

| 7 | xiaohua | 4 | 5 |

| 8 | xiaohua | 4 | 5 |

| 9 | xiaohua | 14 | 15 |

| 10 | nima | 16 | 17 |

+----+---------+--------------------+---------------------+

5 rows in set (0.01sec)

mysql> select * fromaddress;+----+------------------+------+-------+

| id | street | city | state |

+----+------------------+------+-------+

| 3 | uuu | rrr | eee |

| 4 | shipping_address | rrr | eee |

| 5 | shipping_address | rrr | eee |

| 6 | shipping_address | rrr | eee |

| 7 | billing_address | rrr | eee |

| 8 | shipping_address | qqq | eee |

| 9 | billing_address | www | eee |

| 10 | shipping_address | qqq | eee |

| 11 | billing_address | www | eee |

| 12 | shipping_address | qqq | eee |

| 13 | billing_address | www | eee |

| 14 | shipping_address | test | eee |

| 15 | billing_address | test | eee |

| 16 | shipping_address | test | eee |

| 17 | billing_address | test | eee |

+----+------------------+------+-------+

15 rows in set (0.00sec)

mysql>

mysql 表信息

總結

以上是生活随笔為你收集整理的python oracle orm_Python ORM的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 日本欧美色| 久久久久99| 中文字幕在线视频精品 | 欧美mv日韩mv国产网站app | 成人精品福利 | 成年男女免费视频 | 污污视频在线播放 | av日日夜夜 | 国产午夜毛片 | 亚洲一区二区三区视频在线 | 午夜在线观看视频 | 美女脱了裤子让男人桶 | 欧美日韩精品一区二区三区蜜桃 | 色婷婷欧美 | 成人黄色av| 护士人妻hd中文字幕 | 亚洲女同志亚洲女同女播放 | 日韩免费高清视频 | 日本在线一级片 | 麻豆黄色片 | 久久久久夜夜夜精品国产 | 熟女丰满老熟女熟妇 | 亚洲精品乱码久久久久久久 | 国产精品一二三四区 | 亚洲一区二区三区加勒比 | 亚洲欧美偷拍视频 | 凹凸日日摸日日碰夜夜 | 嫩草精品 | 人妻少妇久久中文字幕 | 性爱视频免费 | 亚洲av男人的天堂在线观看 | 免费爱爱视频网站 | 欧美一区二区在线 | 小镇姑娘国语版在线观看免费 | 一区二区视频网 | 日日干夜夜草 | 日韩乱论 | 小明天天看 | 人妻少妇精品中文字幕av蜜桃 | 美女网站在线看 | 国产一区二区三区小说 | 天堂av8在线| 午夜精品视频在线 | 黑人爱爱视频 | 影音先锋精品 | 亚洲一区高清 | 久久艹这里只有精品 | 国产精品成人Av | 黄色在线免费网站 | 国产日韩欧美精品一区 | 国产免费啪啪 | 91在线观看. | 麻豆成人在线视频 | 午夜黄网 | 极品一区 | 钰慧的mv视频在线观看 | 偷拍亚洲另类 | 日本 奴役 捆绑 受虐狂xxxx | 成人影片在线 | 在线观看欧美精品 | 中文字幕免费在线观看视频 | 黄色资源在线 | 香港三级韩国三级日本三级 | 亚洲精品无 | 激情午夜av | 久久精品黄aa片一区二区三区 | 日本成人动漫在线观看 | 欧美成性色| 91成品人影院 | 一区二区三区国 | 久久精品国产亚洲av麻豆蜜芽 | 91麻豆一区二区三区 | 天天干夜夜怕 | 在线播放精品 | 两女双腿交缠激烈磨豆腐 | 中文字幕一区二区三区波野结 | 久色在线 | 日本久色 | 久久久久久一级片 | 亚洲老老头同性老头交j | jizz一区二区三区 | 欧美人与按摩师xxxx | 美女三级黄色片 | 成人免费福利 | 美女无遮挡免费网站 | 蜜桃精品视频在线观看 | 牲欲强的熟妇农村老妇女视频 | 日日操天天操 | 1级性生活片 | 90岁肥老奶奶毛毛外套 | 综合色爱 | 这里只有精品视频在线 | 日韩视频免费 | 污视频在线观看网址 | 午夜小视频在线 | 亚洲成年网 | 香蕉在线视频播放 | 国产精品九九九九九 | 按摩毛片 |