添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

使用 sqlalchemy ,一般通过 Session 对象 ORM 方式操作数据库。如果需要通过 原生 SQL 语句操作数据库,就需要跟 Engine 和 Connect 对象打交道。

Engine 对象包含数据库连接池和数据库方言,通过 create_engine() 函数来创建,engine 对象的 connect() 方法返回 Connection 对象,Connection 对象提供 execute() 方法,允许通过原生 sql 语句来操作数据库。

本篇以 SQLite 数据库为例,简单介绍原生 SQL 操作的一些要点。

原生 SQL 语句

  • create_engine() 函数创建 Engine 对象
  • Engine.connect() 方法返回 Connection 对象
  • Connection.execute() 方法执行 SQL 语句
  • Connection.close() 方法释放资源
from sqlalchemy import create_engine
engine = create_engine('sqlite:///testdb.db')
def test_select_statement():
    with engine.connect() as conn:
        result_proxy = conn.execute("select * from employees")  # 返回值为ResultProxy类型
        result = result_proxy.fetchall()
        for item in result:
            print(item)

带有参数的 SQL 语句

SQLAlchemy 支持两种格式的 sql 语句:?和 :number。

def test_parameter_method1():
    with engine.connect() as conn:
        conn.execute(
            """INSERT INTO employees
                   (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, 
                    AGE, EMAIL, PHONE_NR,EDUCATION, 
                    MARITAL_STAT, NR_OF_CHILDREN)
               VALUES (?,?,?,?,?,?,?,?,?,?);
            """,
            ('9002', 'Stone2', 'Wang', 'M', 20,
             'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0)

方法 2 :

def test_parameter_method2():
    with engine.connect() as conn:
        conn.execute(
            """INSERT INTO employees
                   (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, 
                    AGE, EMAIL, PHONE_NR, EDUCATION, 
                    MARITAL_STAT, NR_OF_CHILDREN)
               VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10);
            """,
            ('9003', 'Stone3', 'Wang', 'M', 20, 'stone@gmail.com',
             '138xxx', 'Bachelor', 'Single', 0)

SQLAlchemy 支持一次插入多行,需要插入的数据放在 list 中:

def test_insert_multiple_rows(self):
    with engine.connect() as conn:
        values = [
            ('9004', 'Stone4', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0),
            ('9005', 'Stone5', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0),
            ('9006', 'Stone6', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0)
        conn.execute(
            """INSERT INTO employees
                   (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, 
                    AGE, EMAIL, PHONE_NR, EDUCATION, 
                    MARITAL_STAT, NR_OF_CHILDREN)
               VALUES (?,?,?,?,?,?,?,?,?,?);
            """, values)

由于执行 sql 插入操作自动提交 (commit),sqlalchemy 提供了 Transactions 来管理 commit 和 rollback,需要提交的时候用 commit() 方法,需要回滚的时候用 rollback() 方法。

def test_txn(self):
    conn = engine.connect()
    with conn.begin() as txn:
        conn.execute(
            """INSERT INTO employees
                   (EMP_ID, FIRST_NAME, LAST_NAME, GENDER, AGE, EMAIL, PHONE_NR,
                    EDUCATION, MARITAL_STAT, NR_OF_CHILDREN)
               VALUES (:1,:2,:3,:4,:5,:6,:7,:8,:9,:10);
            """,
            ('9007', 'Stone7', 'Wang', 'M', 20, 'stone@gmail.com', '138xxx', 'Bachelor', 'Single', 0)
        txn.commit()
    conn.close()

github - executing raw sql statement

使用 sqlalchemy ,一般通过 Session 对象 ORM 方式操作数据库。如果需要通过 原生 SQL 语句操作数据库,就需要跟 Engine 和 Connect 对象打交道。Engine 对象包含数据库连接池和数据库方言,通过 create_engine() 函数来创建,engine 对象的 connect() 方法返回 Connection 对象,Connection 对象提供 execute() 方法,允许通过原生 sql 语句来操作数据库。本篇以 SQLite 数据库为例,简单介绍原生 选用sqlalchemy+mysqlconnector,连接数据库,创建表,对指定表进行CRUD from sqlalchemy import exists, Column, Integer, String, ForeignKey, DateTime, Text, func from sqlalchemy.ext.declarative import declarative_base from sqlalche SQLAlchemy很棒,但是可能很难设置。 使用SQLA-Wrapper,您可以像这样快速启动: from sqla_wrapper import SQLAlchemy db = SQLAlchemy ( 'sqlite:///:memory:' ) class User ( db . Model ): __tablename__ "users" id = db . Column ( db . Integer , primary_key = True ) db . create_all ()
一、问题:有时候 ,我们希望通过原生 sql 来查询数据库,这个时候 应该怎么办呢? sqlalchemy 已经给我们提供了这样的接口, 通过 text 就可以轻松实现了。 二、代码实现: 1.无参数查询: # 无参数查询 sql = 'SELECT machine_room_name,type FROM machine_room limit 2' result = session.execute(text(sql)) print(type(r
cursor = session.execute('insert into users(name) values(:value)', params={"value": 'abc'}) se... cursor = session.execute('insert into users(name) values(:value)',params={"value":'wupeiqi'}) session.commit() print(cursor.lastrowid)
代码如下:select to_char(date_published, ‘yyyymm’) yo from blog group by yo; 转换成sqlalchemy 语句 可以使用 extract() 代码如下:In[3]: year_field = db.func.extract(‘year’, ArticleModel.date_published) In[4]: month_field = db.func.extract(‘month’, ArticleModel.date_published) In[5]: yonth_field = year_field *100+ month
sql to sqlalchemy实例教程-使用MySQL示例雇员数据库 在Python项目中,经常需要操作数据库,而sqlalchemy提供了SQL工具包和对象关系映射(ORM)工具,大大提高了编程开发的效率。为了更好地提升自己的sql以及使用sqlachemy水平,可以使用MySQL自带的示范数据库员工进行练习。 未完待续... ,敬请期待后续的复杂的联合查询语句。 欢迎大家提供需要转变为sqlalchemy语法的sql语句。 如有需求,请加入QQ群:291521082
class demo class DbBase: def __init__(self, db_choice: str, db_user: str, db_password: str, host: str, port: int, db_name: str, pool_size=int(SQLALCHEMY_POOL_SIZE), max_overflow=int(SQLALCHEMY_POOL_MAX_SIZE), pool_recy
from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, ForeignKey, UniqueConstraint, Index from ...
目录安装导入sqlalchemy执行流程创建引擎执行sql方式一方式二两种方式的区别增删改查获取结果fetchonefetchmanyfetchall pip3 install -i http://pypi.douban.com/simple pymysql sqlalchemy --trusted-host pypi.douban.com import sqlalchemy sql...
假如你的项目有需要将orm对象转为sql语句去拼接的需求,可以试试下面这种方法 通常要将orm对象转为sql,可以直接str(对象),但出来的sql在条件值的地方可能不是你想要的,比如: orm对象是: str()转出来的是: 这肯定是不符合我们的需求的 用下面这种方式可以转出源生sql,具体原理自己多研究下 from sqlalchemy.dialects import postgresql # 2.给定ORM Query对象时,为了获得该ClauseElement.compile()方法,需要statement首先访问访问者: statement = query.statement # 3.使用literal_binds标志,传递给compile_kwargs来获取参数:
SQLAlchemy有三种方式可以执行原生SQL语句: 1. 使用execute()方法:可以直接在SQLAlchemy执行任意SQL语句,无需使用ORM模型。例如: ```python from sqlalchemy import create_engine engine = create_engine('postgresql://user:password@hostname/database') with engine.connect() as connection: result = connection.execute("SELECT * FROM my_table") 2. 使用text()方法:使用text()方法可以将SQL语句转换为SQLAlchemy的文本对象,这个对象可以被用于SQLAlchemy的查询语句中。例如: ```python from sqlalchemy import text from myapp import db result = db.session.query(User).filter(text("name = 'John'")).all() 3. 使用 raw SQL 得到 结果集 : ```python from sqlalchemy.orm import sessionmaker from myapp import engine, User Session = sessionmaker(bind=engine) session = Session() result = session.execute('SELECT * FROM users') for row in result: print(row)