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
'programing' 카테고리의 다른 글
| 스프링 - 현재 스레드에 실제 트랜잭션을 사용할 수 있는 EntityManager가 없음 - '영속' 호출을 안정적으로 처리할 수 없음 (0) | 2023.01.14 |
|---|---|
| 목록의 두 요소마다 반복 (0) | 2023.01.14 |
| Galera 클러스터에서의 커밋 후의 노드 상태 (0) | 2023.01.04 |
| JUnit vs 테스트NG (0) | 2023.01.04 |
| Kotlin에서 동시에 확장 및 구현 (0) | 2023.01.04 |