Python - SQLAlchemy 获取"表"对象不是可调用的错误



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

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

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

错误信息:

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

这是表格的外观

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)

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

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

理想情况下,您将表定义在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()

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

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

您可以通过以下方式从app.py获取数据库

from flask_sqlalchemy import SQLAlchemy
db = SQLAlchemy(app)

最新更新