我正在尝试使用带有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
我有以下代码行不断给我一个错误,即引擎对象没有对象执行。我认为我一切都对,但不知道接下来会发生什么。似乎其他人也遇到了这个问题,重新启动他们的笔记本电脑就可以了。我正在使用 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) 我有以下代码:
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) 我正在尝试使用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
对我实际工作的内容显示略有不同的解决方案.
如果我的方法是一个去.
我是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 开发网络框架。下面是我的数据库。该数据库名称是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) 我在烧瓶应用程序中有一个表模型:
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) 我有一个 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 …