1 from sqlalchemy importcreate_engine2 engine=create_engine("mysql+pymysql://root:123@192.168.48.20:3306/test", max_overflow=5) #创建连接,允许溢出5个连接
3 result = engine.execute('select * from student') #使用excute执行原生sql
4 print(result.fetchall()) #获取所有结果,与pymyql类似
事务:
1 from sqlalchemy importcreate_engine2 engine=create_engine("mysql+pymysql://root:123@192.168.48.20:3306/test", max_overflow=5) #创建连接,允许溢出5个连接
3 result = engine.execute('select * from student') #使用excute执行原生sql
4 with engine.begin() as conn: #事务操作
5 conn.execute("insert into student (name, age, res_date) values ('weikang', 33, '1992-11-11')")6
7 print(result.fetchall()) #获取所有结果,与pymyql类似
3.2.创建表
定义数据表,才能进行sql表达式的操作,毕竟sql表达式的表的确定,是sqlalchemy制定的,如果数据库已经存在了数据表还需要定义么?当然,这里其实是一个映射关系,如果不指定,查询表达式就不知道是附加在那个表的操作,当然定义的时候,注意表名和字段名,代码和数据的必须保持一致。定义好之后,就能创建数据表,一旦创建了,再次运行创建的代码,数据库是不会创建的。
sqlalchemy内部组件调用顺序为:使用 Schema Type/SQL Expression Language/Engine/ConnectionPooling/Dialect 进行数据库操作。Engine使用Schema Type创建一个特定的结构对象,之后通过SQL Expression Language将该对象转换成SQL语句,然后通过 ConnectionPooling 连接数据库,再然后通过 Dialect 执行SQL,并获取结果。
TIPS:使用类的方式和使用metadata方式创建表时候区别在于metadata可以不指定主键,而是用class方式必须要求有主键。
demo1:
1 from sqlalchemy importcreate_engine, Table, Column, Integer, String, ForeignKey, MetaData2
3 engine = create_engine("mysql+pymysql://root:123@192.168.48.20:3306/test?charset=utf8",4 encoding="utf-8",5 echo=True,6 max_overflow=5
7 )8 #?charset是字符集编码,echo=True打印输出信息和执行的sql语句默认Flase,max_overflow=5允许溢出连接池连接数量
9 meta = MetaData() #生成源类
10 #定义表结构
11 user = Table('user', meta,12 Column('id', Integer, nullable=True, autoincrement=True, primary_key=True),13 Column('name', String(20), nullable=True),14 Column('age', Integer, nullable=True)15 )16
17 host = Table('host', meta,18 Column('ip', String(20), nullable=True),19 Column('hostname', String(20), nullable=True),20 )21 meta.create_all(engine) #创建表,如果存在则忽视
demo2:
使用orm基类创建
1 from sqlalchemy importcreate_engine, Table, Column, Integer, String, ForeignKey, MetaData, Date2 from sqlalchemy.ext.declarative importdeclarative_base3
4 engine = create_engine("mysql+pymysql://root:123@192.168.48.20:3306/test?charset=utf8",5 encoding="utf-8",6 echo=True,7 max_overflow=5
8 )9 #?charset是字符集编码,echo=True打印输出信息和执行的sql语句默认Flase,max_overflow=5允许溢出连接池连接数量
10 base = declarative_base() #生成ORM基类
11
12
13 #定义表结构
14 classUser(base):15 __tablename__ = 'user' #表名
16 id = Column(Integer, primary_key=True)17 name = Column(String(32))18 age =Column(Integer)19
20 base.metadata.create_all(engine) #创建表,如果存在则忽视