Как использовать параметр и заголовок запросов в Python API с Postgresql? - PullRequest
0 голосов
/ 20 мая 2019

Я работаю над своим проектом с использованием PostgreSQL.Я хочу использовать запрос get с «параметрами» и «заголовками запросов».

Parameter = "gridname" запросы-заголовок = "ownerid"

Вот мой код, который я использую с платформой Python Tornado.Для создания таблицы я использую SQLAlchemy, а для извлечения данных из PostgreSQL использую Raw SQL.

db_string = "postgres://user:PWD@**.**.**.***:####/db_demo"

Base = declarative_base()
db = create_engine(db_string)

class DBFetch(RequestHandler):
    def get(self, gridname):  
        ownerid_var = self.request.headers["ownerid"]
        Session = sessionmaker(bind=db) 
        session = Session()
        Base.metadata.create_all(db)

        result = []
        record = db.execute("SELECT name, columndata, gridname, ownerid, issystem, ispublic, isactive, createdby, createdat, modifiedat, modifiedby
                       FROM col.layout WHERE (ispublic=1 OR (ispublic=0 AND ownerid=?)) AND (gridname=? AND isactive=1)", (ownerid_var,gridname))

        for row in record:
            result.append(row)

        result_json = json.dumps(result)
        self.write(result_json)
        self.finish()
        session.close()

def make_app():
    urls = [("/webcustomization/layouts/(.*)", DBFetch)]
    return Application(urls)

if __name__ == '__main__':
    app = make_app()
    app.listen(3000)
    IOLoop.instance().start()

Но я запускаю свой код на Postman и вставляю ввод для заголовка запроса (ownerid) = 3, затемошибка ниже:

(psycopg2.errors.UndefinedFunction) operator does not exist: character varying =?
LINE 1: ...                  (ispublic=0 AND ownerid::varchar=?)) AND (...
                                                             ^
HINT:  No operator matches the given name and argument type. You might need to add an explicit type cast.

[SQL: SELECT name, columndata, gridname, ownerid, issystem, ispublic, isactive,                            createdby, createdat, modifiedat, modifiedby                            FROM col.layout WHERE (ispublic=1 OR                             (ispublic=0 AND ownerid::varchar=?)) AND (gridname=? AND isactive=1)]
[parameters: ('3', 'RT')]
(Background on this error at: http://sqlalche.me/e/f405)

Что мне нужно сделать, чтобы получить данные?Пожалуйста, предложите

1 Ответ

1 голос
/ 20 мая 2019

Psycopg2 использует% s вместо?:

record = db.execute("SELECT name, columndata, gridname, ownerid, issystem, ispublic, isactive, createdby, createdat, modifiedat, modifiedby
                       FROM col.layout WHERE (ispublic=1 OR (ispublic=0 AND ownerid=%s)) AND (gridname=%s AND isactive=1)", (ownerid_var,gridname))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...