相关疑难解决方法(0)

sqlalchemy:使用参数绑定执行原始sql

我正在尝试使用带有SQLALchemy的参数(在一个alembic脚本中)运行这个简单的原始sql语句:

from alembic import op

t = {"code": "123", "description": "one two three"}

op.execute("insert into field_tags (id, field_id, code, description) "+
               "values (1,'zasz', :code ,:description')", t)
Run Code Online (Sandbox Code Playgroud)

我收到以下错误:

sqlalchemy.exc.StatementError: A value is required for bind parameter 
  'description' (original cause: InvalidRequestError: A value is required for 
  bind parameter 'description') "insert into field_tags (id, field_id, code, 
  description) values (1, 'math', 
  %(code)s ,%(description)s)" []
Run Code Online (Sandbox Code Playgroud)

解决方案:

t = {"code": "123", "description": "one two three"}
from sqlalchemy.sql import text

op.get_bind().execute(text("insert into field_tags (id, field_id, code, description) …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy database-migration flask-sqlalchemy alembic

34
推荐指数
1
解决办法
3万
查看次数

什么是参数化查询?

什么是参数化查询,这样的查询示例在PHP和MySQL中会是什么?

php sql parameterized-query

24
推荐指数
3
解决办法
6万
查看次数

AttributeError:尝试在 python 中运行 sqlalchemy 来管理我的 SQL 数据库时,“Engine”对象没有属性“execute”

我有以下代码行不断给我一个错误,即引擎对象没有对象执行。我认为我一切都对,但不知道接下来会发生什么。似乎其他人也遇到了这个问题,重新启动他们的笔记本电脑就可以了。我正在使用 Pycharm 并已重新启动但没有任何解决方案。任何帮助是极大的赞赏!

import pandas as pd
from sqlalchemy import create_engine, text
import sqlalchemy
import pymysql


masterlist = pd.read_excel('Masterlist.xlsx')

user = 'root'
pw = 'test!*'
db = 'hcftest'

engine = create_engine("mysql+pymysql://{user}:{pw}@localhost:3306/{db}"
                           .format(user=user, pw=pw, db=db))


results = engine.execute(text("SELECT * FROM companyname;"))

for row in results:
    print(row)
Run Code Online (Sandbox Code Playgroud)

python mysql sql sqlalchemy

19
推荐指数
2
解决办法
4万
查看次数

SQLAlchemy execute()将ResultProxy作为Tuple返回,而不是dict

我有以下代码:

query = """
SELECT Coalesce((SELECT sp.param_value
                 FROM   sites_params sp
                 WHERE  sp.param_name = 'ci'
                        AND sp.site_id = s.id
                 ORDER  BY sp.id DESC
                 LIMIT  1), -1) AS ci
FROM   sites s
WHERE  s.deleted = 0
       AND s.id = 10 

"""

site = db_session.execute(query)
# print site 
# <sqlalchemy.engine.result.ResultProxy object at 0x033E63D0>

site = db_session.execute(query).fetchone()
print site  # (u'375')
print list(site) # [u'375']
Run Code Online (Sandbox Code Playgroud)

为什么SQLAlchemy会为此查询返回元组而不是dicts?我想使用以下样式来访问查询的结果:

print site.ci
# u'375'
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy

11
推荐指数
5
解决办法
5万
查看次数

Sqlalchemy,原始查询和参数

我正在尝试使用sqlalchemy执行原始sql查询,并想知道什么是"正确"的方法来做到这一点.

我的查询如下(现在):

db.my_session.execute(
    """UPDATE client SET musicVol = {}, messageVol = {}""".format(
    music_volume, message_volume))
Run Code Online (Sandbox Code Playgroud)

我不喜欢的是字符串格式化和缺少任何参数处理(你好对music_volume中的引号:-D).

我试着按照这个答案:

如何在SQLAlchemy-flask应用程序中执行原始SQL

应用我读到的内容后,我的代码如下:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv , messageVol = :ml", mv=music_volume, ml=message_volume)
Run Code Online (Sandbox Code Playgroud)

但是我收到的错误是mv和ml是无法识别的参数.

如果我将我的代码段更改为此代码,则可以:

db.my_session.execute(
    "UPDATE client SET musicVol = :mv , messageVol = :ml", {mv: music_volume, ml: message_volume})
Run Code Online (Sandbox Code Playgroud)

最后,my_session在名为db.py的文件中启动:

engi = sqlalchemy.create_engine(
    'mysql://{user}:{passwd}@{host}/{db}'.format(
        host=settings.HOST,
        user=settings.USER,
        passwd=settings.PASS,
        db=settings.DB_NAME), execution_options={
        'autocommit': True,
    })

my_session = sqlalchemy.orm.scoped_session(sqlalchemy.orm.sessionmaker(bind=engi), scopefunc=os.getpid)
sqlalchemy.orm.scoped_session.configure(my_session, autocommit=True)
Run Code Online (Sandbox Code Playgroud)

我想知道的是为什么回答上面链接和这部分文档:

http://docs.sqlalchemy.org/en/rel_0_9/core/tutorial.html#using-text

对我实际工作的内容显示略有不同的解决方案.

如果我的方法是一个去.

python mysql sql sqlalchemy

9
推荐指数
1
解决办法
2万
查看次数

从烧瓶中的PostgreSQL函数提交事务

我是Flask和SQLAlchemy的新手(过去3年一直与Django合作).我需要调用一个现有的 PostgreSQL函数来写入数据库中的3个不同的表.这是我无法控制的(我只需要让它工作).该函数返回一条记录(自定义Postgres类型),其中包含有关结果的信息.这是代码:

from flask.ext.sqlalchemy import SQLAlchemy

db = SQLAlchemy()

...

retval = db.engine.execute(
    'SELECT * FROM add_purchase(%s, %s, %s, %s, %s, %s, %s);',
    clean_data.account_id, amount, tax, deposit, clean_data.pos_id, 
    g.token_id, clean_data.external_reference_id).first()

app.logger.info(retval) # for debugging

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

上面的代码运行没有错误.从日志消息中,我可以看到从数据库返回正确的数据.但是,如果我去psql,我看不到新插入的数据.似乎事务从未真正提交过.

我能找到的大多数文档和示例都基于使用SQLAlchemy的ORM.我在这做错了什么?

堆栈信息:

Flask==0.10.1
Flask-SQLAlchemy==1.0
psycopg2==2.5.2
Python 2.7.3
Postgresql 9.3
Run Code Online (Sandbox Code Playgroud)

更新

我找到了一种方法使它工作,这是一个实际上适合我的样本:

from sqlalchemy import exc

...

connection = db.engine.connect()
trans = connection.begin()
try:
    retval = connection.execute(
        'SELECT * FROM add_purchase(%s, %s, %s, %s, %s, %s, %s);',
        clean_data.account_id, amount, tax, deposit,
        clean_data.pos_id, g.token_id,
        clean_data.external_reference_id).first() …
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask flask-sqlalchemy

6
推荐指数
1
解决办法
1412
查看次数

如何获取同一列中的所有值?

我正在使用 python 开发网络框架。下面是我的数据库。该数据库名称是fruit。

name     price
-----    -----
apple    $2
pear     $2
grape    $4
Run Code Online (Sandbox Code Playgroud)

我正在使用 SQLAlchemy。所以类名是Fruit。我应该写什么才能使结果列在下面..?我想从“名称”列中获取值。

[‘苹果’、‘梨’、‘葡萄’]

有没有办法直接执行SQL查询..?

sql_query = 'SELECT name FROM Fruit'
Fruit.query.execute(<sql_query>)
Run Code Online (Sandbox Code Playgroud)

python sqlalchemy flask-sqlalchemy

5
推荐指数
2
解决办法
6123
查看次数

Flask-SQLAlchemy:如何更改表结构?

我在烧瓶应用程序中有一个表模型:

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(80), nullable=False)
    body = db.Column(db.Text, nullable=False)
    pubDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
Run Code Online (Sandbox Code Playgroud)

我使用db.crate_all()and db.add()/db.session向上表添加一些数据,效果很好!

然后我想更新并添加类 Article 的一些属性:

class Article(db.Model):
    id = db.Column(db.Integer, primary_key=True, autoincrement=True)
    title = db.Column(db.String(80), nullable=False)
    body = db.Column(db.Text, nullable=False)
    createDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
    touchDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
    publishDate = db.Column(db.DateTime, nullable=False, default=datetime.datetime.now())
    isVisible = db.Column(db.Boolean, nullable=False, default=True)
    isDraft = db.Column(db.Boolean, nullable=False, default=True)
Run Code Online (Sandbox Code Playgroud)

当我更新类文章后,我db.create_all()再次使用。当我运行我的烧瓶应用程序时,我收到以下错误消息:

cursor.execute(statement, parameters)
sqlalchemy.exc.OperationalError: (sqlite3.OperationalError) no such …
Run Code Online (Sandbox Code Playgroud)

sqlite flask flask-sqlalchemy

5
推荐指数
1
解决办法
7599
查看次数

在事件监听器中创建数据库触发器

我有一个 Flask API,我正在使用 Flask-SQLAlchemy 来处理 SQLite 数据库。我有一个存储日志条目的表,我想将最大行数限制为数字 n。由于插入也是使用原始 SQL 从 Flask 外部的另一个脚本进行的,因此我创建了一个触发器来检查行数并在行数大于 n 时删除最旧的行:

CREATE TRIGGER 'trigger_log_insert' 
BEFORE INSERT ON 'connection_logs' 
WHEN ( SELECT count(*) FROM  'connection_logs' ) > 5 
BEGIN 
DELETE FROM 'connection_logs' 
WHERE id NOT IN ( SELECT id FROM 'connection_logs' ORDER BY id DESC LIMIT 5 ); 
END
Run Code Online (Sandbox Code Playgroud)

该触发器按预期工作,但我很难使用flask-sqlalchemy 设置它。如何使用flask-sqlalchemy 设置触发器/执行原始SQL?SQL 只需要在数据库创建后执行一次,因此我打算在 create_all() 语句之后立即执行它。我偶然发现了这个 StackOverflow 答案,它提出了一个显然很快就会被弃用的解决方案。我还阅读了有关自定义 DDL 的 SQLAlchemy 文档,但我不知道如何使用flask_sqlalchemy 创建此自定义 DDL。当我像 SQLAlchemy 文档中那样创建 DDL 时,我收到一条错误消息 DDL object is not bound to an …

sqlite sqlalchemy flask flask-sqlalchemy

5
推荐指数
1
解决办法
816
查看次数