# _*_ coding: utf-8 _*_ """ python_sqlalchemy.py by xianhu """ import sqlalchemy import sqlalchemy.orm import sqlalchemy.ext.declarative # å©ç¨æ°æ®åºå符串æé engine, echo为Trueå°æå°ææçsqlè¯å¥, å ¶ä»æ°æ®åºç龿¥æ¹å¼å¯èªè¡ç¾åº¦ # engine = sqlalchemy.create_engine("mysql+pymysql://username:password@hostname/dbname", encoding="utf8", echo=True) engine = sqlalchemy.create_engine("mysql+pymysql://dba_0:[email protected]/data_secret", encoding="utf8", echo=False) """ # å©ç¨engineå建connection,å 为使ç¨äºwithæä»¥ä¸éè¦closeæä½,è¿é¨å䏿¯éç¹ with engine.connect() as conn: # æåºç¡çç¨æ³ result = conn.execute("select * from tablename limit 10;") for item in result: print(item) # executeçå ç§ç¨æ³,è¿éå ·ä½è¿æ¯å¾åèpymysqlçç¨æ³,ä¸éè¦æ§è¡commitæä½ conn.execute("insert into tablename(id, url, title) values(1, 'url1', 'title1');") conn.execute("insert into tablename(id, url, title) values(%s, %s, %s);", 2, "url2", "title2") conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", (3, "url3", "title3")) conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(31, "url31", "title31"), (32, "url32", "title32")]) # 使ç¨äºå¡å¯ä»¥è¿è¡æ¹éæäº¤ååæ» trans = conn.begin() try: conn.execute("insert into tablename(id, url, title) values(%s, %s, %s)", [(4, "url4", "title4"), (5, "url5", "title5")]) trans.commit() except Exception as excep: trans.rollback() raise trans.close() """ # é¦å éè¦çæä¸ä¸ªBaseModelç±»,ä½ä¸ºæææ¨¡åç±»çåºç±» BaseModel = sqlalchemy.ext.declarative.declarative_base() # æå»ºæ°æ®æ¨¡åUser class User(BaseModel): __tablename__ = "Users" # 表å __table_args__ = { "mysql_engine": "InnoDB", # 表ç弿 "mysql_charset": "utf8", # 表çç¼ç æ ¼å¼ } # è¡¨ç»æ,å ·ä½æ´å¤çæ°æ®ç±»åèªè¡ç¾åº¦ id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True, autoincrement=True) name = sqlalchemy.Column("name", sqlalchemy.String(50), nullable=False) age = sqlalchemy.Column("age", sqlalchemy.Integer, default=0) # æ·»å è§è²idå¤é®,å ³èå°è¡¨Rolesçid屿§ role_id = sqlalchemy.Column("role_id", sqlalchemy.Integer, sqlalchemy.ForeignKey("Roles.id")) # æ·»å å ³ç³»å±æ§,å ³èå°æ¬å®ä¾çrole_idå¤é®å±æ§ä¸ role = sqlalchemy.orm.relationship("Role", foreign_keys="User.role_id") # æ·»å å ³ç³»å±æ§,å ³èå°æ¬å®ä¾çrole_idå¤é®å±æ§ä¸,å¦æä½¿ç¨äºè¿ç§æ¹å¼,Role模åä¸çuserså¯ä»¥çç¥ # role = sqlalchemy.orm.relationship("Role", foreign_keys="User.role_id", backref=sqlalchemy.orm.backref("users")) # æå»ºæ°æ®æ¨¡åRole class Role(BaseModel): __tablename__ = "Roles" # 表å __table_args__ = { "mysql_engine": "InnoDB", # 表ç弿 "mysql_charset": "utf8", # 表çç¼ç æ ¼å¼ } # è¡¨ç»æ,å ·ä½æ´å¤çæ°æ®ç±»åèªè¡ç¾åº¦ id = sqlalchemy.Column("id", sqlalchemy.Integer, primary_key=True) name = sqlalchemy.Column("name", sqlalchemy.String(50), unique=True) # æ·»å å ³ç³»å±æ§,å ³èå°å®ä¾Userçrole_idå¤é®å±æ§ä¸ users = sqlalchemy.orm.relationship("User", foreign_keys="User.role_id") # å©ç¨Sessionå¯¹è±¡è¿æ¥æ°æ®åº DBSessinon = sqlalchemy.orm.sessionmaker(bind=engine) # å建ä¼è¯ç±» session = DBSessinon() # å建ä¼è¯å¯¹è±¡ # å 餿æè¡¨ BaseModel.metadata.drop_all(engine) # å建ææè¡¨,å¦æè¡¨å·²ç»åå¨,åä¸ä¼å建 BaseModel.metadata.create_all(engine) try: # æ¸ ç©ºæ°æ®,ä¸éè¦commitæä½ session.query(User).filter(User.id != -1).delete() session.query(Role).filter(Role.id != -1).delete() # å 餿°æ®çå¦å¤ä¸ç§å½¢å¼:session.delete() # æå ¥æ°æ®,è¿éçä¸ä¸ªå®ä¾åªæå ¥ä¸æ¬¡,ç¬¬äºæ¬¡æå ¥ä¸çæ session.add(Role(id=1, name="student")) session.add(Role(id=2, name="teacher")) session.commit() session.add(User(name="James", age=20, role_id=1)) session.add(User(name="Wade", age=40, role_id=2)) session.commit() user = User(name="Kobe", age=24, role_id=1) session.add(user) session.commit() # ä¿®æ¹æ°æ® user.name = "Allen" session.merge(user) # 使ç¨mergeæ¹æ³,妿åå¨åä¿®æ¹,妿ä¸åå¨åæå ¥ session.query(User).filter(User.id == user.id).update({User.name: "Allen"}) # 使ç¨updateæ¹æ³ session.query(User).filter(User.id == user.id).update({User.age: User.age + 1}) # 使ç¨updateæ¹æ³,èªå¢æä½ # æ¥è¯¢æ°æ® roles = session.query(Role) # è¿åå ¨é¨ç»æ for role in roles: print("Role:", role.id, role.name) users = session.query(User) # è¿åå ¨é¨ç»æ for user in users: print("User:", user.id, user.name, user.age, user.role_id) # å ¶ä»è·åæ°æ®çæ¹å¼ print("get(id):", session.query(User).get(1)) # è¿åç»æéä¸id为1ç项 print("get[1:3]:", session.query(User)[1:3]) # è¿åç»æéä¸ç第2-3项 # å ¶ä»é«çº§æ¥è¯¢,è¿é以Usersè¡¨ä¸ºä¾ users = session.query(User).filter(User.id > 6) # æ¡ä»¶æ¥è¯¢ users = session.query(User).filter(User.id > 6).all() # æ¡ä»¶æ¥è¯¢,è¿åæ¥è¯¢çå ¨é¨æ°æ® user = session.query(User).filter(User.id > 6).first() # æ¡ä»¶æ¥è¯¢,è¿åæ¥è¯¢æ°æ®ç第ä¸é¡¹ users = session.query(User).filter(User.id > 6).limit(10) # æ¡ä»¶æ¥è¯¢,è¿åæå¤10æ¡æ°æ® users = session.query(User).filter(User.id > 6).offset(2) # æ¡ä»¶æ¥è¯¢,ä»ç¬¬3æ¡æ°æ®å¼å§è¿å users = session.query(User).filter(User.id > 6, User.name == "Kobe") # æ¡ä»¶æ¥è¯¢,andæä½ users = session.query(User).filter(User.id > 6).filter(User.name == "Kobe") # æ¡ä»¶æ¥è¯¢,andæä½ users = session.query(User).filter(sqlalchemy.or_(User.id > 6, User.name == "Kobe")) # æ¡ä»¶æ¥è¯¢,oræä½ users = session.query(User).filter(User.id.in_((1, 2))) # æ¡ä»¶æ¥è¯¢,inæä½ users = session.query(User).filter(sqlalchemy.not_(User.name)) # æ¡ä»¶æ¥è¯¢,notæä½ user_count = session.query(User.id).count() # ç»è®¡å ¨é¨userçæ°é user_count = session.query(sqlalchemy.func.count(User.id)).scalar() # scalaræä½è¿å第ä¸è¡æ°æ®ç第ä¸ä¸ªå段 session.query(sqlalchemy.func.count("*")).select_from(User).scalar() # scalaræä½è¿å第ä¸è¡æ°æ®ç第ä¸ä¸ªå段 session.query(sqlalchemy.func.count(1)).select_from(User).scalar() # scalaræä½è¿å第ä¸è¡æ°æ®ç第ä¸ä¸ªå段 session.query(sqlalchemy.func.count(User.id)).filter(User.id > 0).scalar() # filter() ä¸å å« Userï¼å æ¤ä¸éè¦æå®è¡¨ session.query(sqlalchemy.func.sum(User.age)).scalar() # æ±åè¿ç®,è¿ç¨scalar彿° session.query(sqlalchemy.func.avg(User.age)).scalar() # æ±åå¼è¿ç®,è¿ç¨scalar彿° session.query(sqlalchemy.func.md5(User.name)).filter(User.id == 1).scalar() # è¿ç¨md5彿° users = session.query(sqlalchemy.distinct(User.name)) # å»éæ¥è¯¢,æ ¹æ®nameè¿è¡å»é users = session.query(User).order_by(User.name) # æåºæ¥è¯¢,æ£åºæ¥è¯¢ users = session.query(User).order_by(User.name.desc()) # æåºæ¥è¯¢,ååºæ¥è¯¢ users = session.query(User).order_by(sqlalchemy.desc(User.name)) # æåºæ¥è¯¢,ååºæ¥è¯¢çå¦å¤ä¸ç§å½¢å¼ users = session.query(User.id, User.name) # åªæ¥è¯¢é¨å屿§ users = session.query(User.name.label("user_name")) # ç»æéçååå«å for user in users: print("label test:", user.user_name) # è¿é使ç¨å«å users = session.query(sqlalchemy.func.count(User.name).label("count"), User.age).group_by(User.age) # åç»æ¥è¯¢ for user in users: print("age:{0}, count:{1}".format(user.age, user.count)) # å¤è¡¨æ¥è¯¢ result = session.query(User, Role).filter(User.role_id == Role.id) for user, role in result: print("user %s's role is %s" % (user.name, role.name)) users = session.query(User).join(Role, User.role_id == Role.id) for user in users: print("user join, name:", user.name) # å ³è屿§çç¨æ³ roles = session.query(Role) for role in roles: print("role:%s users:" % role.name) for user in role.users: print("\t%s" % user.name) users = session.query(User) for user in users: print("user %s's role is %s" % (user.name, user.role.name)) except Exception as excep: session.rollback() raise session.close()