当前位置: 首页 > 面试题库 >

sqlalchemy现有数据库查询

戎劲
2023-03-14
问题内容

我正在将SQLAlchemy用作python项目的ORM。我创建了很少的模型/架构,并且工作正常。现在,我需要查询现有的MySQL数据库,而不仅仅是select语句,不能插入/更新。

如何围绕该现有数据库的表创建包装器?我已经简短地阅读了sqlalchemy文档和SO,但是找不到任何相关的内容。所有人都建议执行方法,在这里我需要编写原始sql查询,而我想以与使用SA模型相同的方式使用SQLAlchemy查询方法。

例如,如果现有数据库具有表名User,那么我想使用dbsession来查询它(只有select操作,可能带有join)


问题答案:

您似乎有一种印象,即SQLAlchemy只能与SQLAlchemy创建的数据库结构一起使用(可能使用MetaData.create_all()),这是不正确的。SQLAlchemy可以与现有数据库完美配合,您只需要定义模型以匹配数据库表即可。一种实现方法是使用反射,如IljaEverilä所建议的:

class MyClass(Base):
    __table__ = Table('mytable', Base.metadata,
                    autoload=True, autoload_with=some_engine)

(我认为,一次性脚本完全可以,但是如果数据库结构可能随时间而变化,则可能导致令人沮丧的“真实”应用程序中的错误)

另一种方法是像往常一样简单地定义模型,注意定义模型以匹配数据库表,这并不困难。这种方法的好处是,您只能将数据库表的子集映射到模型,甚至只能将表列的子集映射到模型的字段。假设你在数据库中有10桌,但只关心users表从那里你只需要idnameemail字段:

class User(Base):
    id = sa.Column(sa.Integer, primary_key=True)
    name = sa.Column(sa.String)
    email = sa.Column(sa.String)

(请注意,我们不需要定义一些细节,而这些细节只需要发出正确的DDL,例如String字段的长度或该email字段具有索引的事实)

除非您在代码中创建或修改模型,否则SQLAlchemy将不会发出INSERT /
UPDATE查询。如果要确保查询为只读,则可以在数据库中创建一个特殊用户,并仅授予该用户SELECT权限。另外,您也可以尝试在应用程序代码中回滚事务。



 类似资料:
  • 必须要指定字段名么?不能类似 PHP 那样写了 SQL 直接用么

  • 我有一个,我试图将其转换为String[],以便查询数据库,但我得到了,我不知道问题出在哪里? 将arraylist转换为String[]: 然后我使用游标查询: arraylist和String[]从索引0到34都必须有35个元素 我不明白问题出在哪里?

  • 问题内容: 我在SQLAlchemy中找不到此简单查询的解决方案示例。SQLAlchemy可以替换T-SQL ETL数据吗? 我将此连接用于Windows身份验证: 问题答案: 您需要的是多部分架构名称。如果您使用的是声明式,则可以使用并使用它来执行查询。由于您省略了表或模型定义,因此我将根据您的查询示例生成示例:

  • 问题内容: 我有一个简单的用户模型,定义如下: 当我创建一个新的User对象时,我的字段将设置为当前时间。我想要做的是使它每当我将更改保存到User对象时,我的字段就会自动设置为当前时间。 我已经仔细阅读过文档,但是对于我一生来说,我似乎找不到任何对此的引用。我是SQLAlchemy的新手,所以我确实没有任何经验可以借鉴。 问题答案: 只需在列字段中添加或参数: 我更喜欢列名称。;) 有关列插入/

  • 本文向大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,包括了有关数据库SQL递归查询在不同数据库中的实现方法的使用技巧和注意事项,需要的朋友参考一下 本文给大家介绍有关数据库SQL递归查询在不同数据库中的实现方法,具体内容请看下文。 比如表结构数据如下: Table:Tree ID Name ParentId 1 一级  0 2  二级  1 3  三级  2 4 四级  3 SQL S

  • 问题内容: 这是我简单的测试脚本。只是试图做一个基本的选择语句。在教程中找到了基本知识。 经过一个小时的搜索并尝试了一些解决方案,我比开始时就更接近解决问题了。希望我在某个地方犯了一个简单的错误,但我找不到它… 这是我遇到的错误 任何帮助将非常感激! 问题答案: 如果未在URL中指定,则该方言的默认驱动程序将为“ SQL Server” [1]。这意味着您需要在/etc/unixODBC/odbc