您好,欢迎来到化拓教育网。
搜索
您的当前位置:首页正文

sqlachemy 使用实例

2023-11-09 来源:化拓教育网

sqlachemy 是python中关于sql的ORM,他的存在可以消除底层sql引擎的差异,同事也避免了复杂繁琐的sql语句,因此我们在比较大的应用时常使用它,下面是我写的一个例子#!/usr/bin/env python# -*- coding: UTF-8 -*-from sqlalchemy.orm import mapper, sessionmaker__author__ = ‘lige‘ from sqlalchemy import create_engine, Table, Column, Integer, String, MetaDatafrom sqlalchemy.sql.expression import Castfrom sqlalchemy.ext.compiler import compilesfrom sqlalchemy.dialects.mysql import BIGINT, BINARY, BIT, BLOB, BOOLEAN, CHAR, DATE, DATETIME, DECIMAL, DECIMAL, DOUBLE, ENUM, FLOAT, INTEGER, LONGBLOB, LONGTEXT, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, NCHAR, NUMERIC, NVARCHAR, REAL, SET, SMALLINT, TEXT, TIME, TIMESTAMP, TINYBLOB, TINYINT, TINYTEXT, VARBINARY, VARCHAR, YEAR#表的属性描述对象metadata = MetaData()userTable = Table( "wzp_user",metadata, Column(‘user_id‘, Integer, primary_key=True), Column(‘user_name‘, VARCHAR(50), unique=True, nullable=False), Column(‘password‘, VARCHAR(40), nullable=True))#创建数据库连接,MySQLdb连接方式mysql_db = create_engine(‘mysql://用户名:密码@ip:port/dbname‘)#创建数据库连接,使用 mysql-connector-python连接方式#mysql_db = create_engine("mysql+mysqlconnector://用户名:密码@ip:port/dbname")#生成表metadata.create_all(mysql_db)#创建一个映射类class User(object): pass#把表映射到类mapper(User, userTable)#创建了一个自定义了的 Session类Session = sessionmaker()#将创建的数据库连接关联到这个sessionSession.configure(bind=mysql_db)session = Session()def main(): u = User() #给映射类添加以下必要的属性,因为上面创建表指定这个字段不能为空,且唯一 u.user_name=‘tan9le测试‘ #按照上面创建表的相关代码,这个字段允许为空 u.password=‘123456‘ #在session中添加内容 session.add(u) #保存数据 session.flush() #数据库事务的提交,sisson自动过期而不需要关闭 session.commit() #query() 简单的理解就是select() 的支持 ORM 的替代方法,可以接受任意组合的 class/column 表达式 query = session.query(User) #列出所有user print list(query) #根据主键显示 print query.get(1) #类似于SQL的where,打印其中的第一个 print query.filter_by(user_name=‘tan9le测试‘).first() u = query.filter_by(user_name=‘tan9le测试‘).first() #修改其密码字段 u.password = ‘654321‘ #提交事务 session.commit() #打印会出现新密码 print query.get(1).password #根据id字段排序,打印其中的用户名和密码 for instance in session.query(User).order_by(User.user_id): print instance.user_name, instance.password #释放资源 session.close()query 请求的是对象,没有属性,只有其实例才有属性if __name__ == ‘__main__‘: main()

他的思路很简单,首先创建meta,和表映射,然后meta和库映射,最后创建类object,和表映射,这样我们只需要使用类以及和库相关连的session来访问所需要的表的字段

sqlachemy 使用实例

标签:

小编还为您整理了以下内容,可能对您也有帮助:

sqlalchemy使用之查询指定的列

-1.db.session.query(表名.title, 表名.page).all()

-2.db.session.query(表名).with_entities(表名.title, 表名.page).all()

-3.db.session.query(表名).options(load_only(title,page)).all()

前2个方法返回的是列表里面套元组,直接就是数据(例:[('title1','20'),('title2','22'),('title3','30')])

最后一个方法返回的是列表里面是一个个对象[对象1,对象2,对象3]

且最后一个方法需要导入一下load_only

from sqlalchemy.orm import load_only

Flask构建数据库时出错:

python3下用flask-sqlalchemy对mysql数据库操作案例:

from flask import Flask

from flask.ext.sqlalchemy import SQLAlchemy

app = Flask(__name__)

app.config['SQLALCHEMY_DATABASE_URI'] = 'mysql://username:password@localhost/db_name'

db = SQLAlchemy(app)

class User(db.Model):

id = db.Column(db.Integer, primary_key=True)

username = db.Column(db.String(80), unique=True)

email = db.Column(db.String(120), unique=True)

def __init__(self, username, email):

self.username = username

self.email = email

def __repr__(self):

return '<User %r>' % self.username

admin = User('admin', 'admin@example.com')

db.create_all() # In case user table doesn't exists already. Else remove it.

db.session.add(admin)

db.session.commit() # This is needed to write the changes to database

User.query.all()

User.query.filter_by(username='admin').first()

sqlalchemy做批量数据插入的时候要注意什么?有什么可以优化的

举例来说吧. 关键点都在注释里import sqlalchemy as sa

# 用Sqlite做例子,别的数据库连接字符串不同

engine = sa.create_engine('sqlite://', echo=True)

metadata = sa.MetaData()

# 假定这个是表结构

widgets_table = sa.Table('widgets', metadata,

    sa.Column('id', sa.Integer, primary_key=True),

    sa.Column('foo', sa.String(50)),

    sa.Column('bar', sa.String(50)),

    sa.Column('biz', sa.Boolean),

    sa.Column('baz', sa.Integer),

    )

metadata.create_all(engine)

# 假定这是你的数据结构,在一个list中每个元组是一条记录

values = [

    (None, "Test", True, 3),

    (None, "Test", True, 3),

    ]

# 主要是参考这部分如何批量插入

with engine.connect() as connection:

    with connection.begin() as transaction:

        try:

            markers = ','.join('?' * len(values[0]))

            # 按段数拼成makers = '(?,?,?,?)'

            ins = 'INSERT INTO {tablename} VALUES ({markers})'

            ins = ins.format(tablename=widgets_table.name, markers=markers)

            # 如果你的表已经存在了,widgets_table.name改成表名就行了.

            connection.execute(ins, values)

        except:

            transaction.rollback()

            raise

        else:

            transaction.commit()