用理工科思維看待這個(gè)世界
崇尚的學(xué)習(xí)思維是:輸入奸腺,輸出平衡餐禁,且平衡點(diǎn)不斷攀升。
今天的主題是:sqlalchemy的使用(這是一篇沒有真正實(shí)戰(zhàn)的博文)
0:框架
序號(hào) | 內(nèi)容 | 說明 |
---|---|---|
01 | 概念解釋 | 是什么突照? |
02 | 代碼解釋 | 怎么做帮非? |
03 | 總結(jié) | 如何做的? |
1:概念
- ORM
對(duì)象關(guān)系映射(英語:Object Relational Mapping讹蘑,簡(jiǎn)稱ORM末盔,或O/RM,或O/R mapping)座慰,是一種程序設(shè)計(jì)技術(shù)函荣,用于實(shí)現(xiàn)面向?qū)ο缶幊陶Z言里不同類型系統(tǒng)的數(shù)據(jù)之間的轉(zhuǎn)換涌矢。
圖片顯示:對(duì)象和數(shù)據(jù)庫之間的映射
原理:
SQLAlchemy
是python的一款開源軟件谆沃,提供了SQL工具包及對(duì)象關(guān)系映射(ORM)工具吨瞎。(需要安裝第三方庫)
官方文檔為什么會(huì)出現(xiàn)這種技術(shù)?
一句話解釋:為了避免寫繁復(fù)的sql語句.(隱藏?cái)?shù)據(jù)庫蛮粮,良好的數(shù)據(jù)接口益缎,動(dòng)態(tài)的數(shù)據(jù)映射,引入緩存)
2:代碼解釋
一般步驟:
- 創(chuàng)建連接
- 聲明映射文件
- 創(chuàng)建模式
- 初始化映射類實(shí)例
- 創(chuàng)建回話
- 持久化實(shí)例對(duì)象
1:創(chuàng)建連接
from sqlalchemy import create_engine
engine = create_engine("mysql://root:123456@localhost:3306/test?charset=utf8", echo = True)
# echo= True 會(huì)打印操作數(shù)據(jù)庫的信息
Database_urls 的組成形式:
dialect+driver://username:password@host:port/database
舉例:
mysql://root:123456@localhost:3306/test
postgresql://scott:tiger@localhost/mydatabase
oracle://scott:tiger@127.0.0.1:1521/sidname
-
sqlite:///foo.db
具體參見:點(diǎn)我點(diǎn)我
2:聲明映射文件
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
class User(Base):
__tablename__ = 'users'
id = Column(Integer, primary_key=True)
name = Column(String(10))
password = Column(String(10))
def __repr__(self):
return "<User(name='%s', name='%s', password='%s')>" % (self.name, self.name, self.password)
# 以上聲明了表文件的形式:表名為:users, 包含3列:id, name, password,且定義了數(shù)據(jù)類型
3:創(chuàng)建數(shù)據(jù)庫表
User.metadata.create_all(engine)
# 運(yùn)行后會(huì)在本地mysql數(shù)據(jù)庫中創(chuàng)建這個(gè)數(shù)據(jù)庫表
---
結(jié)果顯示:
2016-05-09 20:52:38,062 INFO sqlalchemy.engine.base.Engine SHOW VARIABLES LIKE 'sql_mode'
2016-05-09 20:52:38,091 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,094 INFO sqlalchemy.engine.base.Engine SELECT DATABASE()
2016-05-09 20:52:38,094 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,114 INFO sqlalchemy.engine.base.Engine show collation where `Charset` = 'utf8' and `Collation` = 'utf8_bin'
2016-05-09 20:52:38,114 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,116 INFO sqlalchemy.engine.base.Engine SELECT CAST('test plain returns' AS CHAR(60)) AS anon_1
2016-05-09 20:52:38,117 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,127 INFO sqlalchemy.engine.base.Engine SELECT CAST('test unicode returns' AS CHAR(60)) AS anon_1
2016-05-09 20:52:38,128 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,158 INFO sqlalchemy.engine.base.Engine SELECT CAST('test collated returns' AS CHAR CHARACTER SET utf8) COLLATE utf8_bin AS anon_1
2016-05-09 20:52:38,158 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,160 INFO sqlalchemy.engine.base.Engine DESCRIBE `users`
2016-05-09 20:52:38,160 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,168 INFO sqlalchemy.engine.base.Engine ROLLBACK
2016-05-09 20:52:38,170 INFO sqlalchemy.engine.base.Engine
CREATE TABLE users (
id INTEGER NOT NULL AUTO_INCREMENT,
name VARCHAR(10),
password VARCHAR(10),
PRIMARY KEY (id)
)
2016-05-09 20:52:38,171 INFO sqlalchemy.engine.base.Engine ()
2016-05-09 20:52:38,655 INFO sqlalchemy.engine.base.Engine COMMIT
數(shù)據(jù)庫test中生成表數(shù)據(jù):
4:創(chuàng)建會(huì)話
from sqlalchemy.orm import sessionmaker
Session = sessionmaker(bind=engine)
session = Session()
5:持久化實(shí)例對(duì)象
ed_user = User(id=1, name='xiexiaolu', password='dianwo')
session.add(ed_user)
session.commit()
數(shù)據(jù)顯示:插入一條數(shù)據(jù)
# 查詢操作
user=session.query(User).filter(User.id ==1).one()
print(user.name)
print(user.password)
# output: id =1 的數(shù)據(jù)的 name 和 password
xiexiaolu
dianwo
創(chuàng)建數(shù)據(jù)表的其他方式
from sqlalchemy import Table, MetaData, create_engine
engine = create_engine("mysql+mysqlconnector://root:123456@localhost:3306/test")
metadata = MetaData()
t1 = Table('users',
metadata,
Column('id',INT, primary_key=True),
Column('name', String(20)),
Column('fullname', String(50)),
Column('password', String(20))
)
t2 = Table('address',
metadata,
Column('id',INT, primary_key = True),
Column('email_address',String(50), nullable=False),
Column('user_id', INT, ForeignKey('users.id'))
)
metadata.create_all(engine)
# 創(chuàng)建兩個(gè)數(shù)據(jù)表分別為users 和 address
插入數(shù)據(jù)的其他方式
# 在建立的會(huì)話基礎(chǔ)上執(zhí)行sql語句
session.execute('insert into users values(2,"Bob","budian")')
session.commit()
# 使用映射類成員變量的數(shù)據(jù)
user = User(id="3", name="alice", password="hgf")
session.add(user)
session.commit()
查詢操作
users = session.query(User).all()# 返回?cái)?shù)據(jù)表所有數(shù)據(jù)
修改數(shù)據(jù)
# 在會(huì)話的基礎(chǔ)上執(zhí)行sql語句
session.execute('update addresses set user_id = 1 where id = 2')
session.commit()
# 使用映射類成員變量的數(shù)據(jù)
session.query(Address).filter(Address.id == 2).update({"user_id": 1})
3:總結(jié)
參考文獻(xiàn):
參考文獻(xiàn)
參考文獻(xiàn)
參考文獻(xiàn)
一切為了精進(jìn).
新搭建的博客:Xie-xiaolu
預(yù)覽界面: