Python 只读SQL。。附近有DSL吗?

Python 只读SQL。。附近有DSL吗?,python,sql,django,dsl,Python,Sql,Django,Dsl,我们想给一些用户从数据库中读取任何他们想要的内容的权限,所以我们很感兴趣——是否有只支持SELECT、WHERE和JOIN操作符的SQL方言 我们希望这样使用它: class MyModelWithSQLRule(models.Model): sql_rule = models.TextField() def what_data_i_will_get(self): """ Here we must get exception with atte

我们想给一些用户从数据库中读取任何他们想要的内容的权限,所以我们很感兴趣——是否有只支持SELECT、WHERE和JOIN操作符的SQL方言

我们希望这样使用它:

class MyModelWithSQLRule(models.Model):
    sql_rule = models.TextField()

    def what_data_i_will_get(self): 
        """
        Here we must get exception with attempt of query like
        DELETE * FROM users_users; SELECT id FROM users_users; 
        """
        parsed_sql_rule = select_only_parser(self.sql_rule)
        return Users.objects.raw(parsed_sql_rule)

这与数据库引擎无关。我想要语言,那是SQL的子家族,但没有像
DELETE这样危险的词

大多数SQL实现都允许您使用权限控制访问和权限,通常使用诸如
GRANT
DENY
REVOKE
之类的关键字。根据您所说的,答案是否定的


您可以为数据库设置2个连接字符串,1个在DB级别设置为只读,另一个可以是读/写连接字符串,然后您只需要使用适当的连接字符串构造数据库会话上下文。这在应用程序级别为您提供了一个感知到的安全级别,但最终仍然依赖于数据库,因为从那里会抛出错误。

如果您不希望数据库进行授权,我认为您必须将问题转移到使用SQL的编程语言。据我所知,没有一种SQL方言只允许非修改查询

如果你只是解析你的表达式,看看它是否使用了任何禁止使用的关键字,比如DELETE、UPDATE、INSERT等。解析(SQL的一大子集)在Python中是非常可行的,我建议你改为研究一下。尽管我仍然认为创建一个只读用户并通过一个单独的连接传递所有查询会更干净、更容易

编辑:


也许您可以使用事务,但从不提交它们?这对您有用吗?

如果您只需要支持django,那么最简单的方法就是编写自己的数据库适配器,为您过滤查询


这将允许您创建自己的“sql方言”。

使用数据库引擎中的权限进行创建!根据您使用的数据库,有很多不同的答案“如何”,那么您使用的是什么数据库,您是否使用OR-M?您使用的是哪个SQL数据库?不同的数据库支持不同的访问控制机制。这听起来像是一个危险和/或限制性的设计。。。一个实用的例子将有助于形成解决方案。为什么您需要在DSL中使用数据库访问控制,而不是使用DB提供的控制?+1,使用内置的访问控制否。。它需要数据库管理,或者需要多个到数据库的连接。我只想检查查询是否已清理。我知道授予
-这不是为了这个任务。:)我曾考虑过在查询中使用类似于
的if['UPDATE'、'DELETE'、'INSERT'],在启动此解决方案后,我决定询问SQL的子语言。scala的sql dsl是有限的——我希望python采用类似的方式。如果要使用简单的
if[…]in query
方法,我建议您再考虑一下。让自己陷入痛苦的世界。暂时忘记了恶意用户,如果有人构建了一个完全合法的
SELECT*FROM Person WHERE Status='DELETE'。我认为您现在面临的挑战是构建自己的SQL解析器或连接到现有的SQL解析器。。。祝你好运实际上我现在接受的答案是否定的,没有面向只读操作的SQL子语言。谢谢。:)