我有如下对象:
class FriendshipLike(object):
__table_args__ = (
db.UniqueConstraint('requesting_user_id', 'accepting_user_id', 'status',
name='unique_friendship'),
)
id = db.Column(db.Integer, primary_key=True, nullable=False)
date = db.Column(db.DateTime(), nullable=False,
default=datetime.datetime.now())
@declared_attr
def requesting_user_id(cls):
return db.Column('requesting_user_id', db.Integer, db.ForeignKey(
'user.id'), nullable=False)
@declared_attr
def accepting_user_id(cls):
return db.Column('accepting_user_id', db.Integer, db.ForeignKey('user.id'),
nullable=False)
Run Code Online (Sandbox Code Playgroud)
和两个模型如下:
class Friendship(FriendshipLike, db.Model, CRUDMixin):
__tablename__ = 'friendship'
class Flirt(FriendshipLike, db.Model, CRUDMixin):
__tablename__ = 'flirt'
Run Code Online (Sandbox Code Playgroud)
我收到警告
SAWarning: 表 Table('friendship', MetaData(bind=None), Column('id', Integer(), table=, primary_key=True, nullable=False), Column('date', DateTime) 上的列 'requesting_user_id' (), table=, nullable=False, default=ColumnDefault(datetime.datetime(2017, 5, 15, 10, 0, 47, 646868))), Column('status', Enum('accepted', 'pending') …
我有查询从数据库中选择用户列表。每个用户对象都有标签列表。这是使用以下关系在 Tag 模型中设置的:
users = db.relationship('User', secondary=user_tag, backref=db.backref('tags', lazy='dynamic'), lazy='dynamic')
Run Code Online (Sandbox Code Playgroud)
当返回查询结果时,我有用户对象:
id {int}1
标签 {AppenderBaseQuery}(选择...)
一切都很好,但我想为 tags 属性分配新列表
user.tags=list()
Run Code Online (Sandbox Code Playgroud)
但是这一行对对象没有任何影响,用户仍然包含 AppenderBaseQuery。这个属性如何变得不可变。我不明白。仍然是 python 新手,如果问题很愚蠢,抱歉。
编辑:
我不会改变数据库。我试图从会话中分离用户对象但没有成功。我已经有了标签列表,只想将其设置为用户对象标签列表。在我将它序列化为 json 并返回带有用户列表的响应之后。通常我使用 url_for 为标签 url 创建,但这次我想与用户一起返回标签列表以使事情更快
我坚持使用flask和flask-sqlalchemy从MySQL db中删除多对多记录。似乎 sqlalchemy 试图从关系表中删除所有行,其中 a 的 id 与链接到 b 的 id 相同。
错误(示例):
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'ksiazka_autor' expected to delete 1 row(s); Only 0 were matched.
Run Code Online (Sandbox Code Playgroud)
或者
sqlalchemy.orm.exc.StaleDataError: DELETE statement on table 'ksiazka_wydawnictwo' expected to delete 552 row(s); Only 551 were matched.
INFO sqlalchemy.engine.base.Engine DELETE FROM ksiazka_kategoria WHERE ksiazka_kategoria.ksiazka_id = %s AND ksiazka_kategoria.kategoria_id = %s
2017-08-29 15:44:34,965 INFO sqlalchemy.engine.base.Engine ((166, 40), (167, 40), (168, 40), (169, 40), (170, 40), (171, 40), (172, 40), (173, 40) ... displaying 10 …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用 flask_security 添加一些角色/用户,但是当我尝试使用SQLAlchemySessionUserDatastore. 所以我首先user_datastore像指南一样创建
db = SQLAlchemy(app)
user_datastore = SQLAlchemySessionUserDatastore(db, User, Role)
security = Security(app, user_datastore)
user_datastore.create_user(email='test', password='passowrd')
Run Code Online (Sandbox Code Playgroud)
这是我偏离指南并尝试只创建一个测试用户的地方。看起来db = SQLAlchemy(app)是导致我的问题。
self.db.session.add(model)
AttributeError: 'SQLAlchemy' object has no attribute 'add'
Run Code Online (Sandbox Code Playgroud) 我有以下查询:
SELECT b.name, c.* FROM branches b,
LATERAL (SELECT * FROM commits WHERE b.id = commits.branch_id ORDER BY authored_date desc LIMIT 4) c
Run Code Online (Sandbox Code Playgroud)
这对我来说很好用,但我不知道我可以在 SQLAlchemy 中使用相同的查询,因为没有为以后定义任何内容。我正在使用 Flask-SQLAlchemy。这是我的模型:
class Commits(db.Model):
id = db.Column(db.Integer, primary_key=True)
branch_id = db.Column(db.Integer,db.ForeignKey("branches.id"), nullable=False)
created_date = db.Column(db.DateTime, default=datetime.datetime.utcnow)
commit_id = db.Column(db.String, nullable=False)
commit_short_id = db.Column(db.String, nullable=False)
commit_message = db.Column(db.Text, nullable=False)
author_name = db.Column(db.String, nullable=False)
author_email = db.Column(db.String, nullable=True, default="")
authored_date = db.Column(db.DateTime, nullable=False)
committer_name = db.Column(db.String, nullable=False)
commiter_email = db.Column(db.String, nullable=True, default="")
commited_date = db.Column(db.DateTime, nullable=True)
class …Run Code Online (Sandbox Code Playgroud) 我正在关注本教程:开始使用 flask-login。
但是,我停留在第 5 步,在那里我开始使用 SQLAlchemy。根据我所阅读的内容,我相信问题可能是循环导入,但我对 Python 编码仍然有点陌生。这个网络应用程序是我在空闲时间做的一个小项目。
所以我想我的总体问题是,这个循环导入是否是循环导入,如果不是,有没有人看到我在这里可能做错了什么?我也在使用 Python 2.7 使用 virtualenv 运行它。
文件结构:
-noteapp
-noteapp
-db
-forms
-static
-templates
-views
__init__.py
app.py
models.py
Run Code Online (Sandbox Code Playgroud)
这是我的 app.py 文件
from flask import Flask
from flask_login import LoginManager
from noteapp.models import db
from noteapp.views.index import bp as index_bp
from noteapp.views.createnote import bp as createnote_bp
from noteapp.views.signup import bp as signup_bp
def init_db():
db.init_app(app)
db.app = app
db.create_all()
app = Flask(__name__)
app.secret_key = 'removed for reasons'
app.config['SQLALCHEMY_DATABASE_URI'] = 'removed for reasons' …Run Code Online (Sandbox Code Playgroud) 我正在使用烧瓶配置,我像这样配置我的应用程序:
app = Flask(__name__)
app.config.from_object('yourapplication.Config')
Run Code Online (Sandbox Code Playgroud)
我的配置对象是这样的:
class Config(object):
DEBUG = True
TESTING = False
DB_USER = os.getenv("DB_USER", "db_user")
DB_PASSWORD = os.getenv("DB_PASSWORD", "db_password")
DB_HOST = os.getenv("DB_HOST", "localhost") # 127.0.0.1"
DB_PORT = os.getenv("DB_PORT", "5555")
DB_SCHEMA = "my_schema"
DB_DATABASE_NAME = "my_database"
SQLALCHEMY_DATABASE_URI = "postgresql://{}:{}@{}:{}/{}".format(
DB_USER, DB_PASSWORD, DB_HOST, DB_PORT, DB_DATABASE_NAME)
SQLALCHEMY_TRACK_MODIFICATIONS = False
Run Code Online (Sandbox Code Playgroud)
我像这样运行我的应用程序(使用烧瓶脚本):
my_flask_app cmd1 arg1 arg2
Run Code Online (Sandbox Code Playgroud)
我想做以下事情:
DEBUG=true DB_PORT=1234 my_flask_app cmd1 arg1 arg2
Run Code Online (Sandbox Code Playgroud)
并覆盖 2 个配置参数。我想知道是否已经有一种方法可以从命令行覆盖配置参数,或者我是否应该编写一些代码?
编辑:为了澄清,我有几个从“Config(object)”继承的预设配置,如下所示:
class Dev(Config):
pass
class Ua(Config):
pass
class Prod(Config):
DEBUG = False
Run Code Online (Sandbox Code Playgroud)
我的应用程序默认为“开发”配置。很容易想象一个场景,您想要运行“UA”配置但像这样覆盖端口:
FLASK_ENV=UA DB_PORT=1234 …Run Code Online (Sandbox Code Playgroud) 我通过 Flask-SQLAlchemy 使用 SQLAlchemy 作为 Web 应用程序的 ORM。
我想自动前导和尾随带空格(例如 str.strip在分配给任何字符串字段时)。
执行此操作的一种方法如下,但需要为每个字符串字段指定它:
class User(db.Model):
_email = db.Column('email', db.String(100), primary_key=True)
@hybrid_property
def email(self): return self._email
@email.setter
def email(self, data): self._email = data.strip()
Run Code Online (Sandbox Code Playgroud)
我想对每个 String 字段更通用地执行此操作(无需为每个字段编写上述内容)。
我已经 pip 安装了 Flask-SQLAlchemy 和 SQLAlchemy 本身,并检查了它们是否都是最新的。但是,当我尝试运行我的 python 代码时:
from flask import Flask, request, render_template
from flask_sqlalchemy import SQLAlchemy
# from tables import Score, ScoreTable
import sqlite3 as sql
app = Flask(__name__)
app.config['SQLALCHEMY_DATABASE_URI'] = 'sqlite:///database.db'
Run Code Online (Sandbox Code Playgroud)
我继续收到此错误:
[pylint] E0401:Unable to import 'flask_sqlalchemy'
Run Code Online (Sandbox Code Playgroud)
有人能帮忙吗?也许我错过了一些简单的东西。
我在 PythonAnywhere 上有一个网站,它使用 Flask 和 Flask-SQLAlchemy 连接到 MySQL 数据库。用户可以使用网站将一个任务进行排队,作为记录保存到数据库中,然后一个单独的计划任务(Python 程序)检查数据库并处理每个未处理的记录。
我遇到的问题是计划任务的数据库查询似乎只有在第一次运行时才找到新记录,但是如果我随后使用网站添加新任务,仍在运行的计划任务的重复数据库查询(每 5 秒)似乎没有检测到新记录。
关于这里可能发生什么的任何想法?
这是 bash 文件运行的代码:
def generate_any_pending_videos():
unfinished_videos = db.session.query(Video)\
.filter(~Video.status.has(VideoStatus.status.in_(['Error', 'Finished', 'Video deleted'])))\
.order_by(Video.datetime_created)\
.all()
for video in unfinished_videos:
try:
logging.info("Attempting to create video for video %d" % video.id)
generate_video(video)
except Exception as e:
logging.error(str(e))
if __name__ == '__main__':
while True:
generate_any_pending_videos()
time.sleep(5)
Run Code Online (Sandbox Code Playgroud) flask-sqlalchemy ×10
python ×10
flask ×6
sqlalchemy ×6
flask-login ×1
many-to-many ×1
mysql ×1
orm ×1
postgresql ×1
python-2.7 ×1