我是SQLAlchmey的新手,我正在尝试实现以下对象/ db表结构(通过使用alembic):
class BaseConfig(Base):
pk = Column(Integer, primary_key=True)
name = Column(Unicode(150), nullable=False, unique=True)
...
# Lots of other general columns, such as description, display_name, creation time etc.
Run Code Online (Sandbox Code Playgroud)
我希望所有其他配置类继承它的预定义列:
class A(BaseConfig):
__tablename__ = "A"
column1 = Column...
column2 = Column...
class B(BaseConfig):
__tablename__ = "B"
column1 = Column...
column2 = Column...
Run Code Online (Sandbox Code Playgroud)
该BaseConfig表不是真正的表,只有拥有公共列一类.除此之外 - A和B之间没有任何关系,也不需要共享的pk等.似乎使用" polymorphic_union "在这里也不相关.
通过尝试运行alembic autogenerate我得到BaseConfig没有表映射类的错误 - 这是真的,我真的没有看到为BaseConfig添加"多态联合"选项的原因,因为这个类是通用的.有什么建议?(在Django和南方这个开箱即用,但在这里似乎不容易支持这种行为).
谢谢,李
from sqlalchemy.orm import subqueryload, joinedload, eagerload
from sqlalchemy import Column, DateTime, String, Integer, ForeignKey, func,Float, sql
from sqlalchemy.orm import relation
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
engine = create_engine('sqlite:///testdb.sqlite')
engine.echo = True
Base = declarative_base()
session = sessionmaker()
session.configure(bind=engine)
Base.metadata.create_all(engine)
s= session()
class Stock(Base):
__tablename__ = 'stock'
stock_id = Column(Integer, primary_key=True)
name = Column(String)
prices = relation("StockPrice")
class StockPrice(Base):
__tablename__ = 'stock_price'
stock_id = Column(Integer, ForeignKey('stock.stock_id'), primary_key=True)
date = Column(String, primary_key=True)
price = Column(Float) …Run Code Online (Sandbox Code Playgroud) 我有一个用于学习目的的系统,用于Flask-SQLAlchemy并部署在Heroku上(python/postgresql:
http://monkey-me.herokuapp.com/
https://github.com/coolcatDev/monkey-me
我的应用程序在本地工作正常,我通过14次成功通过测试对其功能和用例进行了单元测试.
当我部署一切似乎完美.它部署了我定义的环境变量APP_SETTINGS >>> config.BaseConfig,我运行db_create.py脚本来初始化db.我创建了一些用户:
username-userpassword:
Alex-passwordAlex
Jack-passwordJack
Sara-passwordSara
Run Code Online (Sandbox Code Playgroud)
但是缺少一件事......我从主导航栏转到用户页面,我收到一个5oo内部服务器错误说:
The server encountered an internal error and was unable to complete your request. Either the server is overloaded or there is an error in the application.
Run Code Online (Sandbox Code Playgroud)
我在app.py上的应用代码具有以下调试模式:
if __name__ == '__main__':
app.run(debug=True)
Run Code Online (Sandbox Code Playgroud)
但是没有显示进一步的错误.
请注意,如果我在heroku上访问系统并且我已经注销,如果我转到用户,我应该重定向到登录页面,这样我已经调试了多远......
如果我将heroku上的环境变量LAUNCHY_DEBUG设置为true或false,那么一切都会变得疯狂并出现新问题......就像我无法删除用户一样,配置文件图像不会加载....
如果我从heroku中删除LAUNCHY_DEBUG var,则新问题(图像不会加载,无法删除用户..)会在用户页面的原始500错误中保留.
提前感谢您对调试的任何建议
我正在尝试设计我的数据库,但它并没有按照我想要的方式设计.
好吧,我不认为这里有表markdown,我将只有我的数据库表和列:
Student: id, fname, lname
Course: id, code, section, name, room, period
假设所有行在表Student和Course表中都是唯一的.如何设计我的数据库,以便在我查询学生时,它将返回学生所有课程,反之亦然,当我查询课程时,它将返回该课程中的所有学生.
我正在使用Flask和SQLAlchemy,但不知道在这种情况下我是否应该使用多对多?
我收到这个错误,我不确定我做错了什么.我创建了表单,就像我从互联网上获得的那样.我按照这个例子https://wtforms-alchemy.readthedocs.org/en/latest/introduction.html#quickstart
class User(db.Model):
__tablename__= 'users'
DRIVER = 'driver'
ADMIN = 'admin'
username = db.Column('username', db.String(80), primary_key=True)
_pw_hash = db.Column('pw_hash', db.String(128), nullable=False)
_pw_salt = db.Column('pw_salt', db.String(20), nullable=False)
first_name = db.Column('full_name', db.String(100), nullable=False)
last_name = db.Column('last_name', db.String(100), nullable=False)
email = db.Column('email', db.String(120))
phone = db.Column('phone', db.String(20))
#acct_type = db.Column('acct_type', db.Enum(DRIVER, ADMIN), nullable=False)
def check_pw(self, pw):
return self._pw_hash == util.pwhash(pw, self._pw_salt)
@property
def _pw_hash(self):
return self._pw_hash
@_pw_hash.setter
def password(self, pw):
self._pw_salt = util.salt(20)
self._pw_hash = util.pwhash(pw, self._pw_salt)
def __init__(self, un, pw, first, …Run Code Online (Sandbox Code Playgroud) 尝试更新具有以下关系的记录时,我遇到了一些麻烦:
events_mentor_table = db.Table('events_mentors', db.Model.metadata,
db.Column('event_id', db.Integer, ForeignKey('event.id')),
db.Column('mentor_id', db.Integer, ForeignKey('mentor.id'))
)
class Mentor(db.Model):
__tablename__ = 'mentor'
id = db.Column(db.Integer(), primary_key=True)
first_name = db.Column(db.String())
last_name = db.Column(db.String())
job_title = db.Column(db.String())
company_url = db.Column(db.String())
twitter_url = db.Column(db.String())
linkedin_url = db.Column(db.String())
bio = db.Column(db.Text())
def __str__(self):
return '%s %s (%s)' % (self.first_name, self.last_name, self.job_title)
class Event(db.Model):
__tablename__ = 'event'
id = db.Column(db.Integer(), primary_key=True)
date = db.Column(db.Date())
start_time = db.Column(db.Time())
end_time = db.Column(db.Time())
title = db.Column(db.String())
address = db.Column(db.String())
description = db.Column(db.Text())
mentors …Run Code Online (Sandbox Code Playgroud) 我建立了一个大型数据库,并在其中填充了sqlalchemy(原始数据库-不是flask-SQLAlachemy)。我想在站点中添加flask-security,我意识到它依赖flask-SQLAlachemy(而不是原始的),但是我的理解(刚刚开始尝试了解更多信息)flask-SQLAlchemy可以使用原本的。将用户输入数据库似乎可行。当我导航到受限页面时,它会提示我登录(应如此)。输入正确的电子邮件地址和密码时,出现错误AttributeError: type object 'User' has no attribute 'query',并且由于对该错误的追溯没有引用我的任何代码,因此我不确定如何解决它。
认为这可能是从sqlalchemy到flask-SQLAlchemy的转换问题,我觉得我已经尝试了创建新数据库以外的所有工作。我在flask-security或flask-SQLAlchemy文档中找不到任何可帮助解决此问题的信息。有人对如何解决这个问题有想法吗?
这是我的代码:
testing.py
from flask import Flask, render_template
from sqlalchemy import create_engine, asc, and_, or_, func, desc
from sqlalchemy.orm import sessionmaker
import database_setup
from database_setup import Base, User, Role
from flask_sqlalchemy import SQLAlchemy
from flask_security import Security, SQLAlchemyUserDatastore, UserMixin, RoleMixin, login_required
application.config['SECRET_KEY'] = 'super-secret'
# Setup Flask-Security
user_datastore = SQLAlchemyUserDatastore(database_setup, User, Role)
security = Security(application, user_datastore)
engine = create_engine('sqlite:///landtohuntalpha.db')
Base.metadata.bind = engine
DBSession = sessionmaker(bind=engine)
session = DBSession()
@application.route('/user/add/', methods …Run Code Online (Sandbox Code Playgroud) 想象一下按日期和名称键入的表主键.
|Date|Name|Value|
|D1 | A| 2|
|D1 | B| 3|
|D2 | A| 3|
|D2 | C| 1|
Run Code Online (Sandbox Code Playgroud)
如何编写一个SQLAlchemy查询,产生(日期,值)对,其中值是该日期所有名称的所有值?值元组的长度将是,len(distinct(Name))并且缺失值将包含一些标记值(例如,无).
i.e.
[
(D1, 2, 3, None),
(D2, 3, None, 1),
...
]
Run Code Online (Sandbox Code Playgroud)
我不是要在这里要求一个完整的答案,以便让我批准.如果您可以告诉我在文档中搜索/阅读哪些概念(或者真的,请指出任何有用或相关的内容),我会(尝试)自己弄清楚并发布更新.
[请不要大熊猫解决方案]
简单的答案是以长格式加载查询并使用numpy.searchsorted在numpy中进行透视,但如果提交的答案使用了这个,我会对一些性能诊断感兴趣,以便与简单的解决方案进行比较.
目标:使用RESTful服务安全可靠地更新用户密码.
我对使用最佳实践的工作流应该是什么感到困惑:
1.)为知道现有密码的用户更新密码
2.)如果用户忘记,重置密码.
3.)URI(资源)是否RESTful?出于此Web应用程序的目的,我只需要GET和POST进行更改.
我相信我的代码可能是多余的.密码更新方法(如下所示)未正确更新密码.它正在改变它,但是当我尝试使用设置的新密码登录时new_password,密码不匹配.我同样遵循Michael Merickel的这个STACKs答案进行更新.
user = DBSession.query(User).filter_by(email = email).first()if user:user.password = new_password
感谢您的任何见解/输入.我是新手,想要正确编码.
所有这些都是通过HTML而不是JSON.
软件:Python 2.7.9,Pyramid 1.5.7,SQLAlchemy 1.0.9
资源:
__init__.py
config.add_route('users', '/users')
config.add_route('user', '/users/{id:\d+}/{login}') #/{login} added login
config.add_route('reset_password', '/users/{username}/reset_password')#reset
config.add_route('new_password', '/users/{username}/new_password')#new
config.add_route('save_password', '/save_password')#new
Run Code Online (Sandbox Code Playgroud)
views.py
#http://0.0.0.0:6432/users/dorisday/reset_password <--like this
@view_config(route_name='reset_password', renderer='templates/password_recovery.jinja2')
def forgot_password(request):
if request.method == 'GET':
username = request.params['username']
if username is not None:
user = api.retrieve_user(username)
return {}
#http://0.0.0.0:6432/users/macycat/new_password <--like this
@view_config(route_name='new_password', request_method='GET', renderer='templates/new_password.jinja2')
def new_password(request):
logged_in_userid = authenticated_userid(request) …Run Code Online (Sandbox Code Playgroud) 对于SQL语句,仅当输入变量不是None时,我才想执行OR过滤器。
例如
# input variable
var_1 = "apple"
var_2 = "pear"
query = session.query(Table)
if var_1:
query = query.filter(or_(Table.field1 == var_1))
if var_2:
query = query.filter(or_(Table.field2 == var_2))
Run Code Online (Sandbox Code Playgroud)
但这是不可能的。第二个查询改为成为AND语句。
我不想这样做,因为我不想比较输入变量是否为null或空字符串。
query = query.filter(or_(Table.field1 == var_1, Table.field2 == var_2))
Run Code Online (Sandbox Code Playgroud)
我该如何解决?