【问题标题】:Connecting to google-sql with Python3 flexible engine through Flask/SQLAlchemy通过 Flask/SQLAlchemy 使用 Python3 灵活引擎连接 google-sql
【发布时间】:2018-12-12 03:24:40
【问题描述】:

我已将我的应用引擎升级到flexible,现在正在重构代码。除了standard,我还没有使用过Flask,也没有使用过SQLAlchemy。我已经设置了我的数据库,并且之前在standard 环境中拥有有效的、正常运行的连接。我现在正在尝试在Python3 flexible environment 中执行一个简单的 SQL:

SELECT id, latitude, longitude FROM weatherData

我现在通过以下方式与数据库建立了有效连接:

    app = Flask(__name__)
    app.config['WEATHER_DATABASE_URI'] = os.environ['WEATHER_DATABASE_URI']
    app.config['SQLALCHEMY_TRACK_MODIFICATIONS'] = False

    db = SQLAlchemy(app)

各自的环境变量在我的app.yaml 文件中。

我知道SQLAlchemy 使用 ORM,但在我看到的所有示例中,他们在客户端和数据库之间创建了一个类作为“缓冲区”,首先创建表,然后执行 CRUD 操作。例如。

engine = create_engine('sqlite:///student.db', echo=True)
Base = declarative_base()

class Student(Base):
""""""
__tablename__ = "student"

id = Column(Integer, primary_key=True)
username = Column(String)
firstname = Column(String)
lastname = Column(String)
university = Column(String)

#----------------------------------------------------------------------
def __init__(self, username, firstname, lastname, university):
    """"""
    self.username = username
    self.firstname = firstname
    self.lastname = lastname
    self.university = university

 # create tables
 Base.metadata.create_all(engine)

我注意到在这种情况下,他们使用的是engine,这似乎与我无关。简而言之,如何执行上述 SQL 查询?

谢谢:)

【问题讨论】:

  • 嘿@IljaEverilä 感谢您的评论。但是,如果我不想创建该链接中描述的数据库,是否需要创建 User 类?我必须写出表的结构才能连接到它,这似乎很奇怪。
  • 如果您不需要 ORM,您不必使用它。 SQLAlchemy 在某种程度上是 2 合 1 库:Core 和 ORM,建立在前者之上。如果使用 Core,您可以使用更传统的 SQL 方式。

标签: python google-app-engine flask sqlalchemy google-cloud-sql


【解决方案1】:

SQLAlchemy 使用它的engine 类来控制与数据库的交互。首先,创建一个指定连接方式的引擎:

db = sqlalchemy.create_engine(
    # Equivalent URL:
    # mysql+pymysql://<db_user>:<db_pass>@/<db_name>?unix_socket=/cloudsql/<cloud_sql_instance_name>
    sqlalchemy.engine.url.URL(
        drivername='mysql+pymysql',
        username=db_user,
        password=db_pass,
        database=db_name,
        query={
            'unix_socket': '/cloudsql/{}'.format(cloud_sql_instance_name)
        }
    )
}

其次,您使用引擎检索与实例的连接并执行您的操作:

with db.connect() as conn:
     recent_votes = conn.execute(
            "SELECT candidate, time_cast FROM votes "
            "ORDER BY time_cast DESC LIMIT 5"
     ).fetchall()

这允许 SQLAlchemy 以更有效的方式管理您的连接。如果您想在应用程序的上下文中查看这些 sn-ps,请查看此example application

【讨论】:

    猜你喜欢
    • 2019-05-11
    • 2018-11-25
    • 2022-11-11
    • 2021-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-27
    • 2021-04-10
    相关资源
    最近更新 更多