sqlalchemy 的基本使用示例


 

下面的例子中将利用sqlalchemy进行数据库的连接,通过orm方式利用类实例属性操作的方式对数据库进行相应操作,同时应用一些常用的函数。

完整代码如下:

  1 from sqlalchemy import create_engine, exc, orm
  2 from sqlalchemy.ext.declarative import declarative_base
  3 from sqlalchemy.sql.schema import Table, ForeignKey, Column
  4 from sqlalchemy.sql.sqltypes import Integer, VARCHAR
  5 from sqlalchemy.dialects.mysql.base import TINYINT
  6 from sqlalchemy.orm import relationship
  7 
  8 
  9 # declarative_base function will return a class which using active record pattern
 10 # It will combine object opeartion and data operation automatically
 11 Base = declarative_base()
 12 
 13 dsn = 'mysql://root:root@localhost/test_db'
 14 
 15 # Create table based on Base obj
 16 class AccountStore(Base):
 17     __tablename__ = 'account_store'
 18     account_id = Column(Integer, primary_key=True)
 19     items = Column(VARCHAR(20))
 20     account = Column(VARCHAR(50))
 21     password = Column(VARCHAR(50))
 22 print(type(AccountStore))
 23 class SqlalchemyActor():
 24     def __init__(self, dsn):
 25         try:
 26             engine = create_engine(dsn)
 27         except ImportError:
 28             raise RuntimeError
 29         engine.connect()
 30 
 31         # sessionmaker is a factory obj, generate a Session instance, reload __call__ function
 32         # __call__ function will return a session class each time
 33         Session = orm.sessionmaker(bind=engine)
 34         # use Session() to create a class, and assign it to a attribute
 35         self.session = Session()
 36         # Assign costom table and engine to attribute
 37         self.account = AccountStore
 38         self.engine = engine
 39         # Bind engine and table
 40         # Method one: assign manually one by one
 41         self.account.metadata.bind = engine
 42         # Method two: use reflect to map all/partly Table schema
 43         #Base.metadata.reflect(engine)
 44 
 45 ses = SqlalchemyActor(dsn)
 46 
 47 def printf(items):
 48     for i in items:
 49         print(i)
 50     print(30*'-')
 51 
 52 def printfx(items):
 53     for i in items:
 54         print(i.__dict__)
 55     print(30*'-')
 56 
 57 
 58 # execute(SQL)
 59 re = ses.session.execute('SELECT * FROM account_store')
 60 printf(re)
 61 # query(table_name)
 62 # query function similar to Connection.query / Cursor.execute in SQL adaptor
 63 # query(Account) equal to SELECT * FROM acount_store
 64 re = ses.session.query(AccountStore)
 65 print(type(re), re)
 66 printfx(re)
 67 
 68 # query(table_name.column_name)
 69 # SELECT items FROM account_store
 70 re = ses.session.query(AccountStore.items)
 71 print(re)
 72 printf(re)
 73 
 74 sq = ses.session.query(AccountStore)
 75 
 76 # all() / one() / first(): 
 77 # source code does similar to: lambda x: list(x)
 78 print(type(sq))
 79 print(type(sq.all()))
 80 
 81 # filter()
 82 # SELECT * FROM account_store WHERE account_store.items = 'WeChat'
 83 re = sq.filter(AccountStore.items=='WeChat')
 84 print(re)
 85 printfx(re)
 86 
 87 # filter_by()
 88 # SELECT * FROM account_store WHERE account_store.items = 'WeChat'
 89 re = sq.filter_by(items='WeChat')
 90 print(re)
 91 printfx(re)
 92 
 93 # order_by()
 94 # SELECT * FROM account_store ORDER BY account_store.items
 95 re = sq.order_by(AccountStore.items)
 96 print(re)
 97 printfx(re)
 98 
 99 # desc()
100 # SELECT * FROM account_store ORDER BY account_store.items DESC
101 re = sq.order_by(AccountStore.items.desc())
102 print(re)
103 printfx(re)
104 
105 # limit(): select next 3 values
106 # SELECT * FROM account_store LIMIT 3
107 re = sq.limit(3)
108 print(re)
109 printfx(re)
110 
111 # offset(): select from 3rd values
112 # SELECT * FROM table_name OFFSET 2
113 re = sq.offset(2)
114 print(re)
115 printfx(re)
116 
117 # select from 3rd and next 3 values
118 re = sq.limit(3).offset(2) # equal to re = sq.offset(2).limit(3)
119 print(re)
120 printfx(re)
121 re = sq[2:5] # equal to re = sq.offset(2).limit(3)
122 print(re)
123 printfx(re)
124 
125 # DELETE value
126 re = sq.filter(AccountStore.account_id==8).delete()
127 print(re) # 0 fail, 1 success
128 re = sq.filter(AccountStore.account_id==9).delete()
129 print(re) # 0 fail, 1 success
130 re = sq.filter(AccountStore.account_id==10).delete()
131 print(re) # 0 fail, 1 success
132 
133 # INSERT value
134 # Not ORM
135 ses.session.execute(AccountStore.__table__.insert(), {'items': 'KUBO', 'account': 'STAR', 'password': '1d2345', 'account_id': 10})
136 # Below code is an expression of SQL
137 sql = ses.account.__table__.insert([{'items': 'Ericsson', 'account': 'EKELIKE', 'password': '12345', 'account_id': 8}, {'items': 'MOMO', 'account': 'sad', 'password': '145', 'account_id': 9}])
138 ses.session.execute(sql)
139 
140 # SELECT value
141 re = sq.get(9)
142 print(re)
143 # Modify value
144 re.password = 1293
145 
146 # Count values
147 re = sq.count()
148 print(re)
149 
150 ses.session.commit()
151 ses.session.close()
View Code

相关文章: