我想创建一个数据库和用户的集合,以便每个用户只能访问一个数据库。
SO 问题“SQL Server 中用户和登录名之间的区别”讨论了登录名和用户。
我从中了解到,通常登录名用于服务器,而用户用于数据库。但是,我不明白这是如何工作的,因为密码是为登录名设置的,而不是为用户设置的。
这是否意味着我需要为每个数据库使用不同的登录名,或者是否有办法通过单个登录名与多个用户一起使用,每个用户都有自己的密码?
我想在 SQL 中执行此操作,而不是在 GUI 界面中,因为我需要编写脚本。
我想创建一个数据库和用户的集合,以便每个用户只能访问一个数据库。
SO 问题“SQL Server 中用户和登录名之间的区别”讨论了登录名和用户。
我从中了解到,通常登录名用于服务器,而用户用于数据库。但是,我不明白这是如何工作的,因为密码是为登录名设置的,而不是为用户设置的。
这是否意味着我需要为每个数据库使用不同的登录名,或者是否有办法通过单个登录名与多个用户一起使用,每个用户都有自己的密码?
我想在 SQL 中执行此操作,而不是在 GUI 界面中,因为我需要编写脚本。
我要找到一个正则表达式来匹配单个(而不是多个)特定字符内的字符串。例如:
this is =one= and =two= but not ==three== or ==four== etc
这里我使用=
作为分隔符,并且我想要匹配one
and ,two
因为它们在单个分隔符内,但不匹配three
or ,four
因为它们在多个分隔符内。
我认为使用负向前瞻和后瞻可以达到目的:
/(?<!=)=(.+?)=(?!=)/g
但最后我也匹配了其他字符串,所以我显然没有正确理解热负前瞻和后瞻的工作原理。我以为这个表达式的意思是前面=
没有=
,等等。
更大的测试包括多行字符串:
this is =one= and =two= but not ==three== or ==four==.
====
this shouldn’t count at all
====
可能还有另一种方法,这种方法会受到欢迎,但我认为使用前瞻和后瞻的方法会更有教育意义。
我正在使用 PHP 并且计划使用该preg_replace_callback()
函数。
我有一张表,其中标识列的定义如下:
id INT GENERATED BY DEFAULT AS IDENTITY PRIMARY KEY,
首先,我手动插入了几行,包括以id
下列:
INSERT INTO things(id, …)
VALUES (…, …), (…, …), (…, …);
我现在想对其余部分使用自动生成的 ID。
我尝试过:
ALTER TABLE things ALTER COLUMN id RESTART WITH (SELECT max(id) FROM things);
但那不起作用。
我甚至尝试过:
EXECUTE IMMEDIATE 'ALTER TABLE employees ALTER COLUMN id RESTART WITH ' || (SELECT MAX(id)+1 FROM employees);
我知道我可以用一个常数值重新启动,但如果我无法预测插入后的最终 ID,那就没用了。
有没有办法动态重新启动标识列?
我正在编写一些代码来向 tkInter 应用程序添加菜单。这是一个工作示例:
import tkinter
main = tkinter.Tk()
main.title('Menu Test')
menubar = tkinter.Menu(main)
main['menu'] = menubar
m = tkinter.Menu()
menubar.add_cascade(menu=m, label='First')
m.add_command(label='Thing', command=lambda: print('thing'))
m = tkinter.Menu()
menubar.add_cascade(menu=m, label='Second')
m.add_command(label='Whatever', command=lambda: print('whatever'))
# How to add another menu before 'First' ?
main.mainloop()
是否可以在第一个菜单之前First
添加另一个菜单( )?
显然,在这个简单的例子中,我可以先简单地定义它,但我想编写一个从字典中填充菜单的例程。
我正在尝试在 macOS 上的 SwiftUI 中创建一个简单的下拉按钮。通常我会使用类似这样的代码:
MenuButton("☰") {
Button(action: { print("Something") }) {
HStack {
Image(systemName: "questionmark.circle")
Text("Something")
}
}
Button(action: { print("Something Else") }) {
HStack {
Image(systemName: "exclamationmark.circle")
Text("Something Else")
}
}
}
.menuButtonStyle(BorderlessButtonMenuButtonStyle())
仅显示.menuButtonStyle(BorderlessButtonMenuButtonStyle())
菜单图标 (☰)
无下拉菜单
但是,MenuButton
已被弃用,取而代之的是Menu
,这很好,但我需要用 对其进行修改.menuStyle
,并且找不到等效的BorderlessButtonMenuButtonStyle
什么操作相当于Menu
抑制下拉箭头?
我正在编写一个需要知道当前应用程序的 MenuBarExtra。我有一些代码几乎可以完成这项工作:
import SwiftUI
@main
struct XBApp: App {
@State var bundleID: String = ""
var body: some Scene {
MenuBarExtra("Something", systemImage: "questionmark.bubble") {
VStack {
XBContent(bundleID: bundleID)
.padding(0)
}
.onAppear {
bundleID = NSWorkspace.shared.frontmostApplication!.bundleIdentifier!
print("\(#fileID):\(#line) - \(bundleID)")
}
}
.menuBarExtraStyle(.window)
}
}
struct XBContent: View {
var bundleID: String = ""
@State var data: String = ""
init(bundleID: String) {
self.bundleID = bundleID // store received value
}
var body: some View {
VStack {
Text(bundleID) // current value
Text(data) // previous value
}
.onAppear {
data = bundleID // copy value
print("\(#fileID):\(#line) - \(bundleID) | \(data)")
}
}
}
主应用程序设置当前 Bundle ID .onAppear
,然后将其传递给XBContent
视图。我认为这部分工作做得正确,但我愿意接受纠正。
该XBContent
视图仅显示传递的 bundle id 的两个版本:
init()
方法将值存储在属性中。onAppear
到另一个变量中进行测试。在实际生活中,它应该使用该值来读取其他数据。VStack
来自的值init()
和从中复制的值onAppear
。问题就出在这里:复制的值onAppear
总是慢一步。当应用程序首次启动并打开菜单栏附加功能时,第一个值是正确的,而第二个值是默认的空字符串;下次会修复这个问题。当我切换到另一个应用程序并打开菜单栏附加功能时,第一个值是正确的新 bundle id,而第二个值是旧的,直到我再次尝试才恢复正常。
我从中得知,onAppear
当我认为它应该被触发时,它却没有被触发。
我怎样才能使第二个值正确?
我有一个脚本,如果数据尚不存在,它会添加到 SwiftData 存储中。对于普通窗口,我已经让逻辑工作了,但我无法让它在 Menu Extra 上工作。以下是示例:
import SwiftUI
import SwiftData
@main
struct XBApp: App {
var bundleID: String = "whatever"
var body: some Scene {
MenuBarExtra("Something", systemImage: "questionmark.bubble") {
// WindowGroup {
VStack {
XBContent(bundleID: bundleID)
.padding(0)
}
.modelContainer(for: XBData.self)
}
}
}
@Model
class XBData {
@Attribute(.unique) var bundle: String
var note: String
init(bundle: String, note: String = "Note") {
self.bundle = bundle
self.note = note
}
}
struct XBList: View {
@Query(sort: \XBData.bundle, animation: .easeInOut) var allXBarData: [XBData]
@Environment(\.modelContext) private var modelContext
var body: some View {
VStack {
Text("Everything So Far …")
List {
ForEach(allXBarData) { xbd in
HStack {
Text(xbd.bundle)
Spacer()
Text(xbd.note)
Spacer()
Button("", systemImage: "trash", action: {
modelContext.delete(xbd)
})
.buttonStyle(.bordered)
}
}
}
}
.modelContainer(for: XBData.self)
}
}
struct XBContent: View {
var bundleID: String = ""
@Environment(\.modelContext) private var modelContext
@State var xBData: XBData?
@Query(sort: \XBData.bundle, animation: .easeInOut) var allXBarData: [XBData]
func loadData(bundleID: String) -> XBData? {
print("\(#fileID):\(#line) - \(bundleID)")
// let filter = FetchDescriptor<XBData>(predicate: #Predicate { $0.bundle == bundleID })
let filter = FetchDescriptor<XBData>(predicate: #Predicate { $0.bundle == bundleID })
do {
var xbd = try modelContext.fetch(filter).first
print("\(#fileID):\(#line) - \(xbd == nil)")
if xbd == nil {
print("\(#fileID):\(#line) - \(xbd!.note)")
xbd = XBData(bundle: bundleID, note: "Newish Note: \(bundleID)")
modelContext.insert(xbd!)
try modelContext.save()
}
else {
print("\(#fileID):\(#line) - \(xbd!.note)")
}
return xbd
} catch {
print("\(#line) oops")
return nil
}
}
init(bundleID: String) {
self.bundleID = bundleID
}
var body: some View {
VStack {
Text(bundleID)
// XBList()
List {
ForEach(allXBarData) { xbd in
HStack {
Text(xbd.bundle)
Spacer()
Text(xbd.note)
Spacer()
Button("", systemImage: "trash", action: {
modelContext.delete(xbd)
})
.buttonStyle(.bordered)
}
}
}
}
.modelContainer(for: XBData.self)
.onAppear {
xBData = loadData(bundleID: bundleID)!
xBData!.note = "Newish Note: \(bundleID)"
try? modelContext.save()
}
}
}
抱歉,样本太长了。
假设 id 为 的项目whatever
不存在,则应该将其添加并显示在列表中。
在 App 结构中,我注释掉了WindowGroup
。如果我切换到它而不是 MenuBarExtra,它会按预期工作。
我还收到了非常有用的信息:
无法找到或解码原因
无法获取或解码不可用的原因
但是,我通过 WindowGroup 或 MenuBarExtra 获得了该信息,因此我不知道它是否相关。
让它与 MenuBarExtra 一起工作的技巧是什么?
我正在开发一个 macOS 应用程序。我有一个 SwiftData 项目列表。类似这样的内容:
struct TestDataList: View {
@Query var allTestData: [TestData]
var body: some View {
VStack {
Text("Everything")
if allTestData.count > 0 {
List {
ForEach(allTestData){ test in
HStack {
Text(test.id)
Spacer()
Text(test.value)
Spacer()
Button("", systemImage: "trash", action: {
// ?
})
}
}
}
}
}
.modelContainer(for: TestData.self)
}
}
我想添加一个按钮来删除当前项目。
我搜索过周围,但所有内容都是针对 iOS 的,我看不出它在这里如何应用。
我需要什么action
代码才能从列表中删除当前项目,更重要的是从数据中删除当前项目?
我正在尝试编写一些代码,如果新项目尚不存在,则将其插入 SwiftData。我收到了ModelContext
无法解决的错误。
以下代码是精简版,足以生成错误。我删除了测试现有项目的逻辑,直到我能解决这个问题。
抱歉,太长了:
import SwiftUI
import SwiftData
@Model
class TestData {
@Attribute(.unique) var id: String
var value: String
init(id: String, value: String) {
self.id = id
self.value = value
}
}
struct EditTestItem: View {
@Bindable var testData: TestData
var body: some View {
VStack {
HStack {
Text($testData.id)
TextField("Enter Data Here", text: $testData.value)
}
}
.modelContainer(for: TestData.self)
}
}
struct TestContent: View {
var testIDValue: String = ""
@Environment(\.modelContext) private var modelContext
@Query var testData: [TestData]
var testItem: TestData
init(testID: String) {
testItem = TestData(id: testID, value: "New value: \(testID)")
let _ = modelContext.insert(testItem)
do {
try modelContext.save()
} catch {
print("\(#line) oops")
}
}
var body: some View {
VStack {
VStack {
Text(testIDValue)
Text("\(testData.count)")
EditTestItem(testData: testItem)
}
Button("Save", action: {
try? modelContext.save()
})
}
.modelContainer(for: TestData.self)
.onAppear {
}
}
}
#Preview {
TestContent(testID: "b")
.modelContainer(for: TestData.self)
.frame(width: 400)
}
错误包括:
访问安装在视图之外的环境值。这将始终读取默认值并且不会更新。
和
在视图环境中设置 .modelContext 以使用查询
这肯定不是添加数据。
正确的做法是什么?
我正在尝试创建一个ButtonStyle
响应状态变化的自定义。我无法让它在状态改变时更新。
以下是简化版本:
struct TestButton: ButtonStyle {
@State var selected: Bool = true
func makeBody(configuration: ButtonStyleConfiguration) -> some View {
configuration.label
.frame(width: 48)
.padding(EdgeInsets(top: 3, leading: 4, bottom: 3, trailing: 4))
.background(selected ? .green : .red)
.cornerRadius(14)
}
}
struct TestView: View {
@AppStorage("test") var test = 1
var body: some View {
HStack {
Button(test == 1 ? "Yes" : "No") { test = 1 }
.buttonStyle(TestButton(selected: test == 1))
Button(test == 2 ? "Yes" : "No") { test = 2 }
.buttonStyle(TestButton(selected: test == 2))
Button(test == 3 ? "Yes" : "No") { test = 3 }
.buttonStyle(TestButton(selected: test == 3))
}
// .id(UUID()) // trying to avoid this
.padding()
}
}
该变量test
由按钮设置,我希望它改变按钮的外观。test == …
当文本在Yes
和之间切换时,测试正常运行No
。但是,当我将它与selected
参数一起使用时,它不会改变任何东西。它在视图首次加载时设置值,但不会更新。
视图中的变量使用@AppStorage
,但我尝试过@State
并得到相同的结果。
我知道我可以通过添加来伪造它.id(UUID())
,但我不确定这是否是最好的方法。
我怎样才能更新ButtonStyle
?
根据文档,createDirectory
如果出现问题,可能会抛出错误。然而,返回值是:
如果已创建目录,则为 true;如果设置了 createIntermediates 并且目录已存在,则为 true;如果发生错误,则为 false。
我想测试一个目录是否已创建或已经存在。我想像下面这样的事情会做:
do {
let dirOK = try fileManager.createDirectory(atPath: toDirectory, withIntermediateDirectories: true)
if dirOK {
print("ok")
}
else {
print("no")
}
}
catch let error as NSError {
print(error)
}
但是,我收到错误消息:
无法将“()”类型的值转换为预期条件类型“Bool”
如何检查目录是否实际创建?