如何使用SQlAlchemy声明方式插入数据

时间:2015-07-21 06:54:38

标签: python python-3.x flask sqlalchemy

我可以通过这种方式向我的数据库添加数据:

a = Model_tbl_name("3", "da", "3", "eheeee", "", "", "", "", "", "", "", "", func.now(), func.now()) 

db_session.add(a) 
db_session.commit()

但我不能这样做:

data = Model_tbl_name.insert().values({"title_hr":request.form['title_hr'],"text_hr":request.form['text_hr']})

我尝试过类似的但没有帮助:

data = db_session.Model_tbl_name.insert().execute({"title_hr":request.form['title_hr'],"text_hr":request.form['text_hr']})

我最初的动机是传递像JSON这样的所有表单数据,我想让它像这样工作:

data = db_session.Model_tbl_name.insert().execute(json.loads(new_request_form))

在文档中,声明可以完成: http://docs.sqlalchemy.org/en/rel_0_9/core/dml.html?highlight=insert%20values#sqlalchemy.sql.expression.Insert.values

像这样:

users.insert().values({"name": "some name"})

但没有帮助,我无法得到它。我怎样才能使它工作,我必须在values()方法中提供所有JSON数据吗?我该如何编写该命令才能使其正常工作?

其次,我怎么能抓住那个错误,因为,我在Flask中没有错误,只能停止工作。我可以弄清楚在使用SQLAlchemy声明方式时如何显示错误。

P.S。我使用的是Flask框架,SQLAlchemy和Python版本是3.4

3 个答案:

答案 0 :(得分:3)

好吧,我不认为你可以做db_session.Class_name 这就是你能用它做的事:http://docs.sqlalchemy.org/en/rel_1_0/orm/session_basics.html

如果您的问题是默认值,您可以在模型中定义相关的默认值,然后您可以构建一个具有较少字段的对象。

a = Model_tbl_name(title_hr=request.form['title_hr'],
                   text_hr=request.form['text_hr'])

如果您仍想传递字典,可以执行以下操作:

dataDict = json.loads(new_request_form)
a = Model_tbl_name(**dataDict)
db_session.add(a) 
db_session.commit()

恕我直言 - 第一种方法更具可读性和可靠性(您可以检查参数的有效性 - 它们与对象匹配) - >在一天结束时,更安全......

答案 1 :(得分:0)

它适用于Connection类:

        import sqlalchemy as sa

        conn.execute(
            sa.insert(Model_tbl_name).values(
                {
                    Model_tbl_name.field1: 'value1',
                    Model_tbl_name.field2: 'value2',
                    Model_tbl_name.field3: 'value3', 
                }
            )
        )

答案 2 :(得分:0)

如果您需要插入方式(例如,因为您要传递.prefix_with('IGNORE')

您可以这样做

session.execute(Model_tbl_name.__table__.insert().values(
  col1=val1, col2=val2).prefix_with('IGNORE'))