Python - SQLAlchemy 获取“Table”对象不可调用错误

Tol*_*lga 5 python sqlalchemy

我在 python 脚本中定义了一个现有的数据库表,每当我尝试向数据库表插入一行时,我都会收到一条错误消息,指出“表对象不可调用”

您可以在下面找到我收到的代码和错误消息。任何支持将不胜感激:

engine = create_engine('postgresql://user:pwd@localhost:5432/dbname', 

client_encoding='utf8')
metadata = MetaData()
MyTable = Table('target_table', metadata, autoload=True, autoload_with=engine)
Session = sessionmaker()
Session.configure(bind=engine)
session = Session()
:
:
:
def recod_to_db(db_hash):
    db_instance = MyTable(**db_hash)
    session.add(db_instance)
    session.commit()
    return
Run Code Online (Sandbox Code Playgroud)

错误信息:

  File "myprog.py", line 319, in recod_to_db
    db_instance = MyTable(**db_hash)
TypeError: 'Table' object is not callable
Run Code Online (Sandbox Code Playgroud)

这就是桌子的样子

                                                             Table "public.target_table"
      Column       |            Type             |                       Modifiers                        | Storage  | Stats target | Description 
-------------------+-----------------------------+--------------------------------------------------------+----------+--------------+-------------
 id                | integer                     | not null default nextval('target_table_id_seq'::regclass) | plain    |              | 
 carid             | integer                     |                                                        | plain    |              | 
 triplecode        | character varying           |                                                        | extended |              | 
 lookup            | integer                     |                                                        | plain    |              | 
 type              | character varying           |                                                        | extended |              | 
 make              | character varying           |                                                        | extended |              | 
 series            | character varying           |                                                        | extended |              | 
 model             | character varying           |                                                        | extended |              | 
 year              | integer                     |                                                        | plain    |              | 
 fuel              | character varying           |                                                        | extended |              | 
 transmission      | character varying           |                                                        | extended |              | 
 mileage           | integer                     |                                                        | plain    |              | 
 hp                | integer                     |                                                        | plain    |              | 
 color             | character varying           |                                                        | extended |              | 
 door              | integer                     |                                                        | plain    |              | 
 location          | character varying           |                                                        | extended |              | 
 url               | character varying           |                                                        | extended |              | 
 register_date     | date                        |                                                        | plain    |              | 
 auction_end_time  | timestamp without time zone |                                                        | plain    |              | 
 body_damage       | integer                     |                                                        | plain    |              | 
 mechanical_damage | integer                     |                                                        | plain    |              | 
 target_buy        | integer                     |                                                        | plain    |              | 
 price             | integer                     |                                                        | plain    |              | 
 currency          | character varying           |                                                        | extended |              | 
 auctionid         | integer                     |                                                        | plain    |              | 
 seller            | character varying           |                                                        | extended |              | 
 auction_type      | character varying           |                                                        | extended |              | 
 created_at        | timestamp without time zone | not null                                               | plain    |              | 
 updated_at        | timestamp without time zone | not null                                               | plain    |              | 
 estimated_value   | integer                     |                                                        | plain    |              | 
Indexes:
    "target_table_pkey" PRIMARY KEY, btree (id)
Run Code Online (Sandbox Code Playgroud)

Cha*_*mor 3

不使用 auto_map 进行插入的另一种方法是使用表的insert方法。文档在这里

insert(dml,values=None,inline=False,**kwargs) 针对此 TableClause 生成一个 insert() 构造。

例如:

table.insert().values(name='foo')

在代码中它看起来像这样:

  def record_to_db(MyTable):
      insert_stmnt = MyTable.insert().values(column_name=value_you_want_to_insert)
      session.execute(insert_stmnt) 

      session.commit()
      return
Run Code Online (Sandbox Code Playgroud)

理想情况下,您应该将表定义在app.py之外的单独文件夹中。您还可以使用 utils 函数来生成会话,然后提交或捕获异常并回滚。像这样的东西:

def get_db_session_scope(sql_db_session):
    session = sql_db_session()
    try:
        yield session
        session.commit()
    except:
        session.rollback()
        raise
    finally:
        session.close()
Run Code Online (Sandbox Code Playgroud)

那么你的函数将如下所示:

def record_to_db(MyTable):
      with get_db_session_scope(db) as db_session:
          insert_stmnt = 
MyTable.insert().values(column_name=value_you_want_to_insert)
          session.execute(insert_stmnt) 

      return
Run Code Online (Sandbox Code Playgroud)

您可以通过以下方式从app.py获取db

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)
Run Code Online (Sandbox Code Playgroud)