python處理數據庫工具sqlalchemy 頂 原

有價值的參考文檔: http://www.jianshu.com/p/e6bba189fcbd

官方參考網址: http://docs.sqlalchemy.org/en/rel_0_7/orm/relationships.html

安裝sqlalchemy

pip install sqlalchemy

數據庫基本操作

數據庫連接

使用create_engine創建數據庫連接; 例子:

from sqlalchemy import create_engine

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
connect = engine.connect()

創建表

方法一:

from sqlalchemy import Table, MetaData, create_engine

engine = create_engine("mysql+mysqlconnector://root:password@localhost:3306/test")
metadata = MetaData(bind=engine)

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'))
) 
t1.create()
t2.create()

方法二

from sqlalchemy import Table, MetaData, create_engine

engine = create_engine("mysql+mysqlconnector://root:password@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)

String 對象使用時,++必須聲明大小++,對應的是mysql數據庫的varchar

==區別==:方法一是直接在連接的基礎上定義了模式【直接將數據庫和模式對應】,而方法二先定義模式,侯江模式設置到特定的數據庫中。

==重定義表結構==:在表定義的語句末尾添加extend_existing=True

表和類

from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy import Column, INT, String, ForeignKey
from sqlalchemy.orm import backref,relationship


Base = declarative_base()
class User(Base):
    __tablename__ = "users"
    id = Column(INT, primary_key=True)
    name = Column(String)
    fullname = Column(String)
    password = Column(String)

class Address(Base):
    __tablename__ = "addresses"
    id = Column(INT, primary_key = True)
    email_address = Column(String, nullable = False)
    user_id = Column(INT, ForeignKey('users.id'))
    user = relationship('User', backref=backref('addresses',order_by=id))

  1. Column函數
    • 第一個參數是元組的數據類型
    • primary_key指定主鍵,
    • nullable指定元組是否可以爲空(nullable = False表示元組不許爲空)
    • ForeignKey指定外鍵約束,例如ForeignKey('users.id'),表示addresses表外鍵約束users表的主鍵id
  2. relatioship函數[^2x]:將會告知ORM通過Address.user,Address類自身必須鏈接到User類。relationship()使用兩個表的外鍵約束來判定這種鏈接的性質。比如說判定Address.user將會是多對一(many-to-one)關係。
  3. backref函數[^2x]:它將提供一種用於反向查詢的細節,比如說在對象User上的Address對象集是通過User.addresses屬性引用,那麼多對一的關係(many-to-one)反向總會是一對多關係(one-to-many)。還有對於Address.user和User.addresses的關係來說總是雙向的。(一般與relationship函數結合使用。)

會話

使用sessionmaker來綁定數據庫連接,並建立會話。

例子:

from sqlalchemy import Column, String, create_engine
from sqlalchemy.orm import sessionmaker

engine = create_engine('mysql+mysqlconnector://root:password@localhost:3306/test')
Session = sessionmaker(bind = engine)
session = Session()

==連接信息格式==:數據庫類型+數據庫驅動名稱://用戶名:口令@機器地址:端口號/數據庫名,如果碰到中文亂碼問題,可在後面加上?charset=utf8

==注意==:此處的session相當於java中的statement一樣,具有操作數據庫的句柄,可以執行sql語句session.execute("sql語句")

添加數據

方法一:使用session執行sql語句方式

session.execute('insert into users values(2,"Bob","Bob hgf", "hgf")')
session.commit()

方法二:使用映射類成員變量的數據

user = User(id="1", name="alice", fullname="alice hgf", password="hgf")
session.add(user)
session.commit()

查詢操作

  1. 查詢並獲取所有結果
users = session.query(User).all()

==說明==:上述語句返回所有的users表中的數據並以User對象的形式儲存在列表中。

for x in query:
   print x
結果:
<__main__.User object at 0x36aa990>
<__main__.User object at 0x36aaad0>
  1. 查詢並排序 根據表中的某一個元組排序,使用order_by語句
q = session.query(Address).order_by(desc(Address.user_id))
result = q.all()
for x in result:
    print x.email_address

==說明==:執行查詢函數後,再使用all()函數,才能將結果映射成類的列表,類中儲存從數據庫中獲取的一行數據。

  1. 過濾查詢
q = session.query(Address).filter(Address.user_id == 1)
result = q.all()
for x in result:
    print x.email_address
  1. 連接查詢
q = session.query(Address).join(Address.user).group_by(Address.id)
result = q.all()
for x in result:
    print x.email_address
  1. 常見的內聯函數,聚合函數
  • 求平均值:q = session.query(func.avg(Address.id))
  • Count:session.query(Address).filter(Address.user_id ==1).count()
  • distinct:session.query(Address).disdinct().count()

刪除數據

方法一:使用session執行sql語句方式

方法二:使用映射類成員變量的數據

session.query(Address).filter(Address.id ==4).delete() 
session.commit()

級聯刪除:在relationship關聯時要加上passive_deletes=True外鍵要加上ondelete='CASCADE',否則sqlalchemy不能級聯刪除。例如:

class MyClass(Base):
    __tablename__ = 'mytable'
    id = Column(Integer, primary_key=True)
    children = relationship("MyOtherClass",
                    cascade="all, delete-orphan",
                    passive_deletes=True)

class MyOtherClass(Base):
    __tablename__ = 'myothertable'
    id = Column(Integer, primary_key=True)
    parent_id = Column(Integer,
                ForeignKey('mytable.id', ondelete='CASCADE')
    )

修改數據

方法一:使用session執行sql語句方式

session.execute('update addresses set user_id = 1 where id = 2')
session.commit()

方法二:使用映射類成員變量的數據

session.query(Address).filter(Address.id == 2).update({"user_id": 1})

==注意==:update函數中的參數必須是字典類型

刪除表

t1.drop() #t1是sqlalchemy.Table 對象,爲users表的定義

---
**{賀廣福}(heguangfu)**(tm) @2015-9-18
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章