programing

Flask-SQ에서 raw SQL을 실행하는 방법LAlchemy 앱

goodjava 2023. 1. 14. 09:23

Flask-SQ에서 raw SQL을 실행하는 방법LAlchemy 앱

SQL Chemy에서 원시 SQL은 어떻게 실행합니까?

저는 플라스크에서 실행되며 SQL Chemy를 통해 데이터베이스와 인터페이스하는 파이썬 웹 앱을 가지고 있습니다.

원시 SQL을 실행할 방법이 필요합니다.쿼리에는 인라인 뷰와 함께 여러 테이블 조인이 포함됩니다.

시도했습니다.

connection = db.session.connection()
connection.execute( <sql here> )

하지만 게이트웨이 오류가 계속 발생합니다.

시도해 보셨습니까?

result = db.engine.execute("<sql here>")

또는 다음과 같이 입력합니다.

from sqlalchemy import text

sql = text('select name from penguins')
result = db.engine.execute(sql)
names = [row[0] for row in result]
print names

주의:db.engine.execute()는 SQL Chemy 2.0에서는 권장되지 않는 "connectionless"입니다.

SQL Alchemy Session 객체에 고유한 개체가 있음execute방법:

result = db.session.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})

모든 응용 프로그램 쿼리는 원시 SQL 여부에 관계없이 Session 개체를 통과해야 합니다.이렇게 하면 쿼리가 트랜잭션에 의해 적절하게 관리되므로 동일한 요청의 여러 쿼리를 단일 단위로 커밋하거나 롤백할 수 있습니다.엔진 또는 연결을 사용하여 트랜잭션 외부에 나가면 데이터가 손상된 버그를 탐지하기가 어려워질 위험이 훨씬 커집니다.각 요청은 1개의 트랜잭션에만 관련지을 수 있으며,db.session이 경우는, 고객의 애플리케이션에 대응합니다.

또, 주의해 주세요.execute파라미터화된 쿼리용으로 설계되어 있습니다.다음과 같은 매개 변수 사용:val이 예에서는 SQL 주입 공격으로부터 자신을 보호하기 위한 쿼리에 대한 모든 입력에 대해 설명합니다.이러한 파라미터에 대한 값을 제공하려면dict두 번째 인수로서 각 키는 쿼리에 표시되는 파라미터의 이름입니다.매개변수의 정확한 구문은 데이터베이스에 따라 다를 수 있지만, 모든 주요 관계형 데이터베이스는 어떤 형태로든 이러한 구문을 지원합니다.

라고 가정하면SELECTquery. 반복 가능한 개체를 반환합니다.

다음과 같은 다양한 방법으로 개별 열에 액세스할 수 있습니다.

for r in result:
    print(r[0]) # Access by positional index
    print(r['my_column']) # Access by column name as a string
    r_dict = dict(r.items()) # convert to dict keyed by column names

개인적으로, 저는 결과를namedtuples:

from collections import namedtuple

Record = namedtuple('Record', result.keys())
records = [Record(*r) for r in result.fetchall()]
for r in records:
    print(r.my_column)
    print(r)

Flask-SQ를 사용하지 않는 경우LALchemy 확장 기능에서도 세션을 쉽게 사용할 수 있습니다.

import sqlalchemy
from sqlalchemy.orm import sessionmaker, scoped_session

engine = sqlalchemy.create_engine('my connection string')
Session = scoped_session(sessionmaker(bind=engine))

s = Session()
result = s.execute('SELECT * FROM my_table WHERE my_column = :val', {'val': 5})

문서: SQL Expression 언어 튜토리얼 - 텍스트 사용

예:

from sqlalchemy.sql import text

connection = engine.connect()

# recommended
cmd = 'select * from Employees where EmployeeGroup = :group'
employeeGroup = 'Staff'
employees = connection.execute(text(cmd), group = employeeGroup)

# or - wee more difficult to interpret the command
employeeGroup = 'Staff'
employees = connection.execute(
                  text('select * from Employees where EmployeeGroup = :group'), 
                  group = employeeGroup)

# or - notice the requirement to quote 'Staff'
employees = connection.execute(
                  text("select * from Employees where EmployeeGroup = 'Staff'"))


for employee in employees: logger.debug(employee)
# output
(0, 'Tim', 'Gurra', 'Staff', '991-509-9284')
(1, 'Jim', 'Carey', 'Staff', '832-252-1910')
(2, 'Lee', 'Asher', 'Staff', '897-747-1564')
(3, 'Ben', 'Hayes', 'Staff', '584-255-2631')

SELECT SQL 쿼리 결과는 다음 방법으로 얻을 수 있습니다.from_statement()그리고.text()여기 보이는 것처럼요.당신은 이런 식으로 튜플을 다룰 필요가 없어요.클래스의 예로서User테이블 이름을 가진 모습users해 보세요

from sqlalchemy.sql import text

user = session.query(User).from_statement(
    text("""SELECT * FROM users where name=:name""")
).params(name="ed").all()

return user

SQL Chemy © 1.4

SQL Chemy 1.4부터는 무접속 또는 암묵적인 실행이 폐지되었습니다.

db.engine.execute(...) # DEPRECATED

쿼리뿐만 아니라 베어 문자열도 사용할 수 있습니다.

새 API를 사용하려면 다음과 같은 명시적인 연결이 필요합니다.

from sqlalchemy import text

with db.engine.connect() as connection:
    result = connection.execute(text("SELECT * FROM ..."))
    for row in result:
        # ...

마찬가지로 기존 세션을 사용할 수 있는 경우 기존 세션을 사용하는 것이 좋습니다.

result = session.execute(sqlalchemy.text("SELECT * FROM ..."))

또는 파라미터를 사용합니다.

session.execute(sqlalchemy.text("SELECT * FROM a_table WHERE a_column = :val"),
                {'val': 5})

자세한 내용은 설명서의 "연결 없는 실행, 암시적 실행"을 참조하십시오.

result = db.engine.execute(text("<sql here>"))

합니다.<sql here>한 하지 autocommit모드. 따라서 삽입 및 업데이트는 데이터베이스에 반영되지 않습니다.

변경 후 커밋하려면

result = db.engine.execute(text("<sql here>").execution_options(autocommit=True))

Flask Shell에서 SQL 쿼리를 실행하는 방법에 대한 간단한 답변입니다.

먼저 모듈을 매핑합니다(모듈/앱이 관리되고 있는 경우).UNIX 운영체제를 사용하는 경우)에서 다음을 수행합니다.

export FLASK_APP=manage

플라스크 쉘 실행

flask shell

필요한 것을 Import 합니다.

from flask import Flask
from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
from sqlalchemy import text

쿼리 실행:

result = db.engine.execute(text("<sql here>").execution_options(autocommit=True))

응용 프로그램이 있는 현재 데이터베이스 연결을 사용합니다.

★★★★★★★★★★★를 사용해 본 적이 ?connection.execute(text( <sql here> ), <bind params here> )설명서에 기재되어 있는 바와 같이 바인드 파라미터가 있습니까?이를 통해 많은 파라미터 포맷 및 성능 문제를 해결할 수 있습니다.게이트웨이 오류는 타임아웃인가?바인드 파라미터는 복잡한 쿼리를 훨씬 빠르게 실행하는 경향이 있습니다.

다른 은 '배꼽을 피하고 때는 '배꼽을 잡고 싶다', '배꼽을 잡고 싶다 '배꼽을 잡고 싶다' 이렇게 예요.first,one ★★★★★★★★★★★★★★★★★」all★★★★★★★★★★★★★★★★★★:

query = db.engine.execute("SELECT * FROM blogs "
                           "WHERE id = 1 ")

assert query.first().name == "Welcome to my blog"

언급URL : https://stackoverflow.com/questions/17972020/how-to-execute-raw-sql-in-flask-sqlalchemy-app