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()